Совместное использование NSOperationQueue между контроллерами представления? - PullRequest
13 голосов
/ 31 августа 2009

Я использую NSOperationQueue для управления HTTP-соединениями (используя ASI-HTTPRequest). Так как у меня есть несколько представлений, и необходимо, чтобы эти разные представления запрашивали HTTP-соединения, должен ли я попытаться создать глобальное NSOperationQueue в делегате приложения или мне нужно иметь одно в каждом представлении? Я не знаком с NSOperationQueue.

Я хотел бы знать, а) какова лучшая практика и б) если нет наилучшей практики, каковы компромиссы, если таковые имеются.

Я пытался поместить очередь операций в класс (как свойство), где я обрабатываю соединения с сервером, но задача никогда не выполнялась. Не могу понять, но [операции с очередями] = 0. Если кто-то знает решение этой проблемы, я полагаю, это было бы лучшим местом для его установки.

Ответы [ 3 ]

14 голосов
/ 31 августа 2009

Я решил эту проблему, добавив метод класса в 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
3 голосов
/ 31 августа 2009

Мое личное предпочтение - иметь синглтон, который управляет всеми http-запросами. Затем каждое представление будет запрашивать синглтон для выполнения вызова http, передавая себя в качестве делегата для этого вызова, затем синглтон передает руки, которые делегируют и вызывают вызов NSOperation, а затем NSOperation выполняет обратный вызов после завершения вызова.

0 голосов
/ 31 августа 2009

Если у вас уже есть указатель на класс, который обрабатывает соединения в каждом контроллере представления / представления, нет причин, по которым вам также понадобится указатель на очередь операций.

Я полагаю, что вы хотите сделать что-то вроде: a) view (Controller) передает url (+ data) объекту обработки сервера, b) объект обработки сервера создает операцию и помещает ее в очередь, которая есть и только у нее указатель на.

Трудно понять, почему это не сработало, если вы не предоставите более подробную информацию.

Я настоятельно рекомендую взглянуть на ASIHTTPRequest , который предоставляет класс NetworkQueue для решения таких задач. Он имеет несколько удобных полей делегатов, которые позволяют вам регистрироваться, чтобы отслеживать прогресс, знать, когда загрузка или загрузка завершена и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...