Быстрое перечисление Objective C и асинхронные серверные операции.Модель поможет? - PullRequest
1 голос
/ 04 июля 2011

Если у меня есть метод с именем «-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
}

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

Ответы [ 3 ]

3 голосов
/ 04 июля 2011

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];
            }

        });

    });
}

}

3 голосов
/ 04 июля 2011

Не хочу NSOperation, потому что я не хочу иметь дело с потоками

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

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

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

NotifyOperation переопределяет main следующим образом

-(void) main
{
    [someObjectEgViewController performSelectorOnMainThread: @selector(finishedUpload)
                                                 withObject: nil 
                                              waitUntilDone: NO];
}
1 голос
/ 04 июля 2011

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

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

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