- (voID)main { AFhttpSessionManager *sessionManager = [AFhttpSessionManager sharedSessionManager]; [sessionManager GET:@"url" parameters:nil success:^(NSURLSessionDataTask *task,ID responSEObject) { NSLog(@"Success"); } failure:^(NSURLSessionDataTask *task,NSError *error) { NSLog(@"Failure"); } ];}
我注意到,当有多个 *** 作被创建并快速连续地添加到NSOperationQueue时,有时会执行特定 *** 作的回调.我潜入AFNetworking试图找出原因.我最终进入 – [AFURLSessionManager dataTaskWithRequest:completionHandler],它看起来像:
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(voID (^)(NSURLResponse *response,ID responSEObject,NSError *error))completionHandler{ NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request]; AFURLSessionManagerTaskDelegate *delegate = [AFURLSessionManagerTaskDelegate delegateForManager:self completionHandler:completionHandler]; [self setDelegate:delegate forTask:dataTask]; return dataTask;}
我在创建dataTask之后立即添加了一个日志记录语句:
NSLog(@"Task with ID %@ created for %@ on queue %@",@(dataTask.taskIDentifIEr),request.URL.path,dispatch_get_current_queue());
日志显示问题:
2014-02-26 14:11:25.071 App[50094:6a2f] Task with ID 15 created for /url1 on queue <OS_dispatch_queue: NSOperationQueue 0xc4b8560[0xc4b8ac0]>2014-02-26 14:11:25.071 App[50094:460f] Task with ID 16 created for /url2 on queue <OS_dispatch_queue: NSOperationQueue 0xc4b8560[0xc4b8ac0]>2014-02-26 14:11:26.274 App[50094:6a2f] Task with ID 18 created for /url2 on queue <OS_dispatch_queue: NSOperationQueue 0xc4b8560[0xc4b8ac0]>2014-02-26 14:11:26.274 App[50094:6c17] Task with ID 17 created for /url1 on queue <OS_dispatch_queue: NSOperationQueue 0xc4b8560[0xc4b8ac0]>2014-02-26 14:11:27.546 App[50094:6307] Task with ID 20 created for /url2 on queue <OS_dispatch_queue: NSOperationQueue 0xc4b8560[0xc4b8ac0]>2014-02-26 14:11:27.546 App[50094:6b17] Task with ID 19 created for /url1 on queue <OS_dispatch_queue: NSOperationQueue 0xc4b8560[0xc4b8ac0]>2014-02-26 14:11:28.705 App[50094:6b17] Task with ID 21 created for /url1 on queue <OS_dispatch_queue: NSOperationQueue 0xc4b8560[0xc4b8ac0]>2014-02-26 14:11:28.705 App[50094:6307] Task with ID 21 created for /url2 on queue <OS_dispatch_queue: NSOperationQueue 0xc4b8560[0xc4b8ac0]>2014-02-26 14:11:32.091 App[50094:6307] Task with ID 22 created for /url2 on queue <OS_dispatch_queue: NSOperationQueue 0xc4b8560[0xc4b8ac0]>2014-02-26 14:11:32.091 App[50094:6b17] Task with ID 23 created for /url1 on queue <OS_dispatch_queue: NSOperationQueue 0xc4b8560[0xc4b8ac0]>
请注意,日志中的第四个集合具有相同的taskIDentifIEr,这是AFNetworking用于通过委托将任务与其回调相关联的方法.
如果我强制NSOperations在主队列上运行,那么我无法重新创建问题 – taskIDentifIEr始终是唯一的.
以前有人见过这样的事吗?我是否需要确保 – [NSURLSession dataTaskWithRequest:]仅在主线程上运行才能获得taskIDentifIEr冲突?
解决方法 不知道这是否仍然与你有关,但这件事让我整晚都在敲打.事实证明,你在问题中部分回答了问题.事实证明,如果
NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request];
异步运行,然后NSURLSession实例将相同的taskIDentifIEr分配给不同的任务的可能性很小.
如果没有分支AFNetworking并同步所有dataTaskWithRequest:方法,那么有两种方法可以解决这个问题.
如果您不需要从此方法返回NSURLSessionTask,那么最好的方法是创建自己的调度队列以及您希望使用会话管理器进行的任何请求,只需异步将其发送到该队列,如下所示:
static dispatch_queue_t my_queue;my_queue = dispatch_queue_create("MyQueuename",disPATCH_QUEUE_CONCURRENT);// ... Later,that very same daydispatch_async(my_queue,^{ // [sessionManager GET: ...});
然而,这个方法对你的问题唯一的问题是它似乎都在同一个 *** 作队列上执行,所以也许这种方式在你的情况下不起作用.另一种方式(我是这样做的)实际上更简单.只需在AFURLSessionManager上同步,这样dataTaskWithRequest:的调用只能同步发生,如下所示:
@synchronized(sessionManager) { // [sessionManager GET: ... }
或者,是的,您可以在主线程上执行任务创建.但对于某些项目来说,并不总是那么简单.
总结以上是内存溢出为你收集整理的ios – 非唯一的NSURLSessionDataTask taskIdentifiers全部内容,希望文章能够帮你解决ios – 非唯一的NSURLSessionDataTask taskIdentifiers所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)