Я работаю с некоторым кодом, который выполняет кучу асинхронных операций с различными обратными вызовами; Snow Leopard сделал это невероятно легко с помощью блоков и GCD.
Я звоню NSTask
с NSBlockOperation
вот так:
[self.queue addOperationWithBlock:^{
NSTask *task = [NSTask new];
NSPipe *newPipe = [NSPipe new];
NSFileHandle *readHandle = [newPipe fileHandleForReading];
NSData *inData = nil;
[task setLaunchPath:path];
[task setArguments:arguments];
[task launch];
while ((inData = [readHandle availableData]) && [inData length]) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// callback
}];
}
[task waitUntilExit];
}];
Этот подход работает отлично. Это похоже на магию, если мои обратные вызовы правильно обрабатывают параллелизм.
Теперь я хочу иметь возможность объединить некоторые из этих вызовов; это внутри метода «обновить» объекта модели и может занять много времени. Если пользователь нажмет кнопку обновления, это не должно связывать машину и все такое.
Здесь я вижу дилемму реализации. Я могу создать целую кучу очередей - по одной для каждого типа вызова - и установить для их числа одновременных операций значение 1, а затем вызывать -cancelAllOperations
всякий раз, когда наступает время для нового вызова.
В качестве альтернативы, я мог бы сделать еще несколько ручных операций по учету текущих вызовов и управлять единой очередью для каждого объекта модели (как я делаю), или я мог бы пойти еще дальше и использовать глобальную очередь.
Насколько тяжел NSOperationQueue
? Является ли создание большого количества очередей плохим архитектурным решением? Есть ли лучший способ объединить эти задачи?