У меня есть одноэлементный класс, содержащий 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 будет ждать буквально целую вечность, чтобы разблокировать основной поток.
Что может быть причиной этого, я сомневаюсь, что это ошибка в структуре яблок, поэтому я спрашиваю здесь перед отправкой. Я сделал какие-либо очевидные ошибки, которые могут вызвать эту проблему?