Вызов AFHTTPSessionManager.downloadTasks в AFNetworking 2 замораживает основной поток

У меня есть одноэлементный класс, содержащий AFHTTPSessionManager *fileTransferSessionManager. В нем я иногда хочу отменить все загрузки, прежде чем начать их заново, это делается путем запуска через DownloadTasks и отмены их. Проблема в том, что при вызове атрибута downloadtasks основной поток зависает, если есть запущенные загрузки.

// My method canceling download tasks:
NSArray *downloadTasks =  self.fileTransferSessionManager.downloadTasks;   
for (NSURLSessionDownloadTask *downloadTask in downloadTasks) {
     [downloadTask cancel];
}

// In AFURLSessionManager.m
- (NSArray *)downloadTasks {
    return [self tasksForKeyPath:NSStringFromSelector(_cmd)];
}

Вызывает этот метод, который замораживает основной поток, потому что getTasksWithCompletionHandler с dispatch_semaphore_signal(semaphore) никогда не вызывается:

// In AFURLSessionManager.m
- (NSArray *)tasksForKeyPath:(NSString *)keyPath {
    __block NSArray *tasks = nil;
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
        if ([keyPath isEqualToString:NSStringFromSelector(@selector(dataTasks))]) {
            tasks = dataTasks;
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(uploadTasks))]) {
            tasks = uploadTasks;
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(downloadTasks))]) {
            tasks = downloadTasks;
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(tasks))]) {
            tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:@"@unionOfArrays.self"];
        }
        dispatch_semaphore_signal(semaphore);
    }];
    NSLog(@"current thread: %@", [NSThread currentThread]);

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    return tasks;
}

Я отследил проблему до self.session getTasksWithCompletionHandler: никогда не входя в его блок, и поэтому dispatch_semaphore_wait будет ждать буквально целую вечность, чтобы разблокировать основной поток.

Что может быть причиной этого, я сомневаюсь, что это ошибка в структуре яблок, поэтому я спрашиваю здесь перед отправкой. Я сделал какие-либо очевидные ошибки, которые могут вызвать эту проблему?


person bogen    schedule 24.03.2014    source источник
comment
Я решил тупик, запустив этот метод в фоновой очереди. Но на самом деле вы можете добиться того же, используя асинхронный метод, предоставляемый NSURLSession. Вероятно, вам следует опубликовать его на доске вопросов Github для AFNetworking.   -  person Ben Affleck    schedule 13.05.2014
comment
У меня та же проблема, опубликованная здесь: stackoverflow.com/ вопросов/31944465/ .. но я уже в отдельной (не основной) очереди, и это меня не исправит. Как вы это исправили?   -  person xaphod    schedule 12.08.2015