Совместное использование NSOperationQueue через View Controllers?
Я использую NSOperationQueue для управления HTTP-соединениями (используя ASI-HTTPRequest). Поскольку у меня есть несколько представлений и необходимость иметь эти разные представления, запрашивающие HTTP-соединения, я должен попытаться создать глобальный NSOperationQueue в делете приложения, или мне нужно иметь один в каждом из представлений? Я не знаком с NSOperationQueue.
Я хотел бы знать, а) что такое лучшая практика и б) если нет лучшей практики, какие компромиссы есть, если они есть.
Я попытался поместить очередь операций в класс (как свойство), где я обрабатываю соединения с сервером, но задача никогда не запускалась. Не могу понять это, но [операции очереди] = 0. Если кто-то знает решение этого вопроса, я полагаю, это было бы лучшим местом для его размещения.
Ответы
Ответ 1
Я решил это, добавив метод класса в NSOperationQueue, который, как я думаю, Apple пропустил; общая рабочая очередь. Я добавляю это как категорию в NSOperationQueue как это:
// NSOperationQueue+SharedQueue.h
@interface NSOperationQueue (SharedQueue)
+(NSOperationQueue*)sharedOperationQueue;
@end
// NSOperationQueue+SharedQueue.m
@implementation NSOperationQueue (SharedQueue)
+(NSOperationQueue*)sharedOperationQueue;
{
static NSOperationQueue* sharedQueue = nil;
if (sharedQueue == nil) {
sharedQueue = [[NSOperationQueue alloc] init];
}
return sharedQueue;
}
@end
Таким образом, мне не нужно управлять целым рядом очередей, если мне это действительно нужно. У меня есть легкий доступ к общей очереди от всех контроллеров моего представления.
Я даже добавил категорию в NSObject, чтобы еще проще добавить новые операции в эту общую очередь:
// NSObject+SharedQueue.h
@interface NSObject (SharedQueue)
-(void)performSelectorOnBackgroundQueue:(SEL)aSelector withObject:(id)anObject;
@end
// NSObject+SharedQueue.m
@implementation NSObject (SharedQueue)
-(void)performSelectorOnBackgroundQueue:(SEL)aSelector withObject:(id)anObject;
{
NSOperation* operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:aSelector
object:anObject];
[[NSOperationQueue sharedOperationQueue] addOperation:operation];
[operation release];
}
@end
Ответ 2
Мое личное предпочтение для этого - иметь singleton, который управляет всеми HTTP-запросами. Каждое представление затем попросило singleton сделать http-вызов, передав себя в качестве делегата для этого вызова, а затем синглтонные руки, которые делегируют и переадресуют NSOperation, а затем NSOperation обращается после завершения вызова.
Ответ 3
Если у вас уже есть указатель на класс, который обрабатывает соединения в каждом контроллере представления/просмотра, нет причин, по которым вам также потребуется указатель на очередь операций.
Я полагаю, что то, что вы хотите сделать, это что-то вроде: a) view (Controller) hand url (+ data) для сервера, обрабатывающего объект, b) серверные объекты обработки создают операцию и помещают ее в очередь, чтобы она и только она указатель на.
Трудно понять, почему это не сработало, если вы не указали более подробно.
Я настоятельно рекомендую посмотреть на ASIHTTPRequest, который предоставляет класс NetworkQueue для обработки такого рода задач. Он имеет несколько удобных полей делегатов, которые позволяют вам регистрироваться, чтобы отслеживать прогресс, знать, когда загрузка или загрузка завершены и т.д.