У меня есть вариант использования, когда мне нужно загрузить много файлов с помощью NSURLSession.
Чтобы предотвратить истечение времени ожидания сеансовых задач, мне нужно поместить их в очередь операций и ограничить количество одновременных загрузок, чтобы они не голодали.
Моя идея состоит в том, что я буду загружать резюме задачи в nsoperation и загружать их в nsoperationqueue, что ограничит количество одновременных действий.
Проблема в том, что когда я вызываю [задачу возобновления], код завершится, и nsoperation будет считать себя завершенной, даже если я жду завершения загрузки файла.
Вот некоторый код.
NSURLSessionDownloadTask *task = [session downloadTaskWithRequest: request
completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
//move the file to a permanent location
CFRunLoopStop(CFRunLoopGetCurrent());
}
//I have instantiated a class global NSOperation queue.
[imageDownloadQueue addOperationWithBlock:^void() {
[task resume];
CFRunLoopRun();
}];
Как я могу сохранить поток nsoperation живым, пока я жду обратного вызова? Я также пробовал использовать nsrunloop и добавлять порт в NSMachPort. Это не помогло.
Кроме того, установка HttpMaximumConnectionsPerHost в NSURLSession не помогает, поскольку таймер тайм-аута запускается при возобновлении задачи. А это значит, что я получу больше тайм-аутов, чем раньше.
NSOperation
, возвращаетеtrue
вместоisAsynchronous
и переопределяетеstart()
вместоmain()
. Вам нужно будет установитьisExecuting
иisFinished
вручную в соответствующее время (например, когда ваша операция завершится). Вы не хотите, чтобы нить оставалась в живых. Вы хотите, чтобы операция отметила себя завершенной в нужное время. Вот как работают асинхронные операции. Это просто означает, что вы делаете это вручную, а не когдаmain()
возвращается. - person Rob Napier   schedule 23.09.2016