Самый простой способ, который я нашел, - это раскрутить вторую нить. Прочтите Руководство по программированию потоков .
Затем я возвращаюсь к интерфейсу через executeSelectorOnMainThread: withObject: waitUntilDone: . Легко отправить и NSObject, который инкапсулирует данные, полученные из сети.
Например, если мой сетевой код может запросить переполнение стека для нескольких вопросов, то у меня может быть:
@interface Question {
NSString *question;
NSString *answer;
}
@end
@interface QuestionQueryResults {
NSMutableArray *questions;
}
@end
и у меня есть контроллер представления со следующим открытым методом:
@interface QuestionsController : UIViewController {
}
- (void)setQuestions:(QuestionQueryResults*)questions;
@end
Затем метод setQuestions
заполнит все ваши текстовые поля, перезагрузит табличное представление и все, что нужно сделать.
Потоковый код будет выглядеть примерно так:
void performQuery(QuestionsController *delegate) {
QuestionQueryResults *results = [[QuestionQueryResults alloc] init];
// Process the network data to fill in results
[delegate performSelectorOnMainThread:@selector(setQuestions:)
withObject:results
waitUntilDone:YES]; // Wait so we can `release` the results
[results release];
}
Вы можете рассматривать QuestionQueryResults
как «ViewModel» в архитектуре MVC. Прекрасно работает и производит минимальные глюки интерфейса.