1

У меня есть обработка изображений, которые занимают много времени и ресурсов, поэтому я использую NSOperation + NSOperatioQueue + делегат для callBack. и все работают.NSOperation с блоком завершения

Теперь я хочу использовать блоки, потому что его очень элегантный и простой в использовании в tableView, например.

, что мне нужно сделать, это просто как AFJSONRequestOperation, например:

NSURL *url = [NSURL URLWithString:@"url"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
NSLog(@"App.net Global Stream: %@", JSON); 
} failure:nil]; 
[operation start]; 

в этом примере я не вижу каких-либо operationQueue! как я могу сделать то же самое?

[ImageManagerOperation modifyImage:(UIImage*)image completitionBlock:(void (^)(UIImage *modifiedImage))complete]; 

где ImageManagerOperation - это NSOperation.

Я знаю, что могу установить блок завершения, но мне все равно нужно добавить операцию в очередь.

Я хочу минимизировать номер строки в моем коде (если возможно :)).

ответ

1

Обычно код в NSOperation является синхронным. NSOperationQueue предоставляет потоки, необходимые для запуска кода в фоновом режиме. Таким образом, вы добавляете свою операцию в очередь, и очередь затем вызывает start на вашей операции в фоновом потоке.

AFJSONRequestOperation - особый тип NSOperation, называемый concurrent, это означает, что операция уже предоставляет собственные потоки фона внутри. В некоторых случаях вы можете вызвать метод start операции concurrent вне очереди. Поскольку операция уже предоставляет собственные потоки фона, она все равно будет работать в фоновом режиме. В этом случае start может быть вызван непосредственно, чтобы свести к минимуму код, показанный в примере.

Обычно вы бы еще добавить concurrent операции к NSOperationQueue, потому что вы хотите воспользоваться другими вещами очередь обеспечивает такие как управление dependancies и maxConcurrentOperationCount.

Так что просто создайте себя NSOperationQueue и добавьте к нему свою операцию. Вам не нужно звонить start, очередь сделает это за вас.

+0

спасибо, так что в конце концов я должен создать свою собственную очередь, я это для tableView, это будет много усилий, поэтому я делаю это с GCD, и это нормально работает, и я действительно –

+0

спасибо, поэтому в конце концов я должен создать свою собственную очередь, чтобы адаптировать ее для tableView будет много усилий, поэтому я делаю это с GCD, и это нормально работает (я думаю, что GCD работает правильно?). вы отвечаете на мой вопрос, поэтому я принимаю его спасибо :) –

+0

Нет, NSOperation использует GCD не наоборот. Похоже, вам нужна очередь, поэтому вы можете ограничить объем работы, которую вы делаете, из своего вида таблицы. Я предполагаю, что вы выполняете работу для каждой ячейки во время прокрутки? Если кто-то прокручивает много, вы можете начать слишком много работы. Использование очереди помогает ограничить это, а также позволить вам отменить задачи, которые могут быть запущены для ячейки, но больше не нужны, потому что пользователь прокрутил прочь. Есть сессия WWDC (я думаю, 2012), в которой подробно обсуждается это. Вы должны искать это видео, если это то, что вы делаете. –

Смежные вопросы