TaskIdentifier в NSURLSession не изменяется

Я пытаюсь загрузить несколько видео через NSURLSession в моем приложении. Но taskIdentifier для каждого запроса приходит один и тот же. Это не получать изменения для каждого запроса. Как мы можем отслеживать наш запрос? Как мы можем узнать, какой из них завершен?

Это мой код:

   _uploadTask = [_session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

    id jsonResponse= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];

   }];

 [_uploadTask resume];
 NSLog(@" task ID %ld",_uploadTask.taskIdentifier);

Здесь: _uploadTask - это экземпляр NSURLSessionUploadTask, _session - это экземпляр NSURLSession, запрос - это экземпляр NSMutableURLRequest, а тело - NSData.OutPut это:

"task ID 1"

3 ответа

Я бы сделал следующее, чтобы отслеживать

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

Сначала добавьте свойство, чтобы вы могли хранить идентификатор, созданный NSURLSession. Этот идентификатор создается автоматически, поэтому неизвестно, является ли он 1,2,3 или что-то еще. Так что вам нужно хранить его при создании задачи.

_uploadTask = [_session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

    // do your thing

   }];
 _myTaskID = [_uploadTask taskIdentifier];
 [_uploadTask resume];

Затем вызовите этот метод, чтобы отменить эту задачу

- (void)cancelTaskByIdentifer:(long)myTaskID {

    [[NSURLSession sharedSession] getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {

        if (!dataTasks || !dataTasks.count) {
            return;
        }
        for (NSURLSessionTask *task in dataTasks) {
            long taskId = [task taskIdentifier];
            if (taskId==myTaskID) [task cancel];
        }
    }];
}

Например:

[self cancelTaskByIdentifier:_myTaskID];

Была такая же проблема

Если вы создаете URLSession каждый раз, когда отправляете запрос, идентификатор всегда будет начинаться с 1. Вы должны создать URLSession только один раз.

Другие вопросы по тегам