Custom tasks NSURLSessionDataTask taskIdentifiers

I have an iOS application that uses NSOperationQueue, NSOperations and AFNetworking 2.1.0 to disable server requests. The method -[NSOperation main]looks something like this:

- (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");
              }
  ];
}

I noticed that from time to time callbacks for a specific operation are never executed when several operations are created and added to NSOperationQueue in quick succession. I went into AFNetworking to try to understand why. I ended up in -[AFURLSessionManager dataTaskWithRequest:completionHandler], which looks like this:

- (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;
}

I added a registration statement right after creating the dataTask:

NSLog(@"Task with id %@ created for %@ on queue %@", @(dataTask.taskIdentifier), request.URL.path, dispatch_get_current_queue());

The log shows the problem:

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]>

Note that the fourth set in the log is the same taskIdentifieras that used by AFNetworking to associate tasks with their callbacks through the delegate.

NSOperations , - taskIdentifier .

- - ? , -[NSURLSession dataTaskWithRequest:] , taskIdentifier?

+4
2

, , , . , .

,

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 day

dispatch_async(my_queue, ^{
    // [sessionManager GET: ...
});

, , , , , , . ( ) . AFURLSessionManager, dataTaskWithRequest: :

@synchronized(sessionManager) {
    // [sessionManager GET: ... 
}

, , . .

+1

NSURLSessionDataTask AFURLSessionManager , GET. NSURLSession.

:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
    NSURL *URL = [NSURL URLWithString:@"http://example.com/testapi.php"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (error) {
            NSLog(@"error!");
        } else {
            NSLog(@"task successful!");
        }
    }];
    [dataTask resume];
0

Source: https://habr.com/ru/post/1529083/


All Articles