iOS threading - лучший метод обратного вызова - PullRequest
0 голосов
/ 15 марта 2012

Я хотел очистить один из моих проектов и извлечь части моего исходного кода, которые я часто использую, в одном классе.Этот класс обрабатывает некоторые запросы к веб-сервису, пока все в порядке;).До тех пор, пока я не извлек код в свой собственный класс, я обрабатывал эти запросы с помощью потоков и обратных вызовов в вызывающем классе.

Теперь у меня есть вопрос с рекомендациями:

В своем коде я делаючто-то вроде (упрощенно):

(void)foo{
   Helper *h =[[Helper alloc]init];
  [h doRequest];
}

doRequest выполняет сетевое действие (в своем собственном классе), и мне приходится ждать, пока этот запрос не будет завершен.Поэтому мне нужен обратный вызов или что-то вроде этого.

Должен ли я просто поток doRequest вкл.waituntildone = ДА?

Должен ли я также выполнять потоковую работу в сети в классе Helper?Или этого достаточно, чтобы вызвать метод в виде потока примерно так:

[NSThread detachNewThreadSelector:@selector(h doRequest) toTarget:self withObject:nil];

Какова лучшая практика для получения обратного вызова из doRequest к классу вызывающего после того, как он завершит свои задачи, чтобы я мог обработать возвращенныйзначения из веб-сервиса?

Заранее спасибо.

Йоханнес

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

Учитывая, что doRequest не возвращается, пока запрос не будет выполнен, вы можете сделать

- (void)fooCompletion:(void (^)(void))completion {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        Helper *h =[[Helper alloc]init];
        [h doRequest];
        if (completion) {
            dispatch_async(dispatch_get_main_queue(), ^{
                // doRequest is done
                completion();
            });
        }
    });
}

Для вызова метода:

[self fooCompletion:^{
    // do something after doRequest is done
}];
2 голосов
/ 15 марта 2012

Лично я предпочитаю вызывать executeSelectorOnMainThread: withObject: waitUntilDone: в конце любого вспомогательного потока, которому необходимо отправить информацию обратно.

[self performSelectorOnMainThread:@selector(infoFromService:) withObject:aDictionaryWithInfo waitUntilDone:NO];

- (void)infoFromService:(NSDictionary *)aDictionary {
    //Process all the information and update UI
}

Обязательно всегда используйте основной поток для любых обновлений пользовательского интерфейса, даже если они происходят в середине рабочего потока, например, для обновления количества загруженной информации. Используйте ту же технику для вызова основного потока с соответствующей информацией.

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