Операции быстрого перечисления Objective-C и асинхронного сервера. Помощь модели?

Если у меня есть метод под названием «-uploadToServer: (Object *) objectToUpload» и изменяемый массив из нескольких объектов, и я хочу загрузить каждый объект один за другим, как мне лучше справиться с этим?

Существует три важных соображения:

  1. Не нужно NSOperation, потому что я не хочу заниматься проблемами потоковой передачи
  2. Необходимо дождаться уведомления о завершении задачи, прежде чем продолжить
  3. Вызов сервера асинхронный и неблокирующий

Вот какой код у меня уже есть:

for (Object *task in objectsToUpload) { [self uploadToServer:task]; //need to wait to get notification that upload completed } -(void)uploadToServer:(Object *)objectToUpload { //perform asynchronous server operation here //either block callback or delegate to notify //self that upload finished } 

Увидев выше, как вы думаете, я должен справиться с этим?

Не нужно NSOperation, потому что я не хочу заниматься проблемами потоковой передачи

Честно говоря, я думаю, что это ваш самый простой вариант. Единственный другой способ – сделать асинхронный ввод-вывод и использовать цикл выполнения.

В NSOperation вам понадобятся два разных типа операций, например, UploadOperation и NotifyOperation : один для загрузки объекта и один для отправки уведомления в основной поток, когда все будет сделано.

Затем вы будете перебирать все объекты, помещая их все в NSOperationQueue в UploadOperation , каждый из которых зависит от предыдущего ( addDependency: . Наконец, вы должны поставить NotifyOperation в очередь в зависимости от последнего UploadOperation .

Функция NotifyOperation переопределяет main функции следующим образом

 -(void) main { [someObjectEgViewController performSelectorOnMainThread: @selector(finishedUpload) withObject: nil waitUntilDone: NO]; } 

objectsToUpload – это NSMutableArray задач

 -(void)uploadToServer{ //check if there is a task available if (objectsToUpload.count > 0){ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { //get first task id nextTask = [objectsToUpload objectAtIndex:0]; //do something //complete async dispatch_async(dispatch_get_main_queue(), ^(void) { //remove completed task [objectsToUpload removeObject:nextTask]; //complete async upload task, check or notify and or start the next task BOOL shouldDoNextTask = [self check]; if (shouldDoNextTask){ [self uploadToServer]; } }); }); } 

}

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

NSURLConnection предоставит делегату методы обратного вызова.