Выполнение RestKit как NSOperartion - PullRequest
4 голосов
/ 06 июня 2011

В настоящее время я выполняю миграцию проекта, в котором использовались ASIHTTPRequest и SBJson, на RestKit.

В предыдущей реализации использовалась операция NSOperation для выполнения HTTP-запроса, синтаксического анализа объекта JSON и выполнения необходимых вызовов API Core Data.

Я переформулировал это следующим образом:

@implementation UpdateBeers

#pragma mark - NSOperation

- (void)main {
    [[RKClient sharedClient] get:@"/beers" delegate:self]; 
}

- (void)request:(RKRequest*)request didLoadResponse:(RKResponse*)response {  
    debug(@"didLoadResponse");
}  

- (void)request:(RKRequest *)request didFailLoadWithError:(NSError *)error {
    debug(@"%@", error);
}

#pragma mark - Memory

- (void) dealloc {
    [super dealloc];
}

@end

В журнале появляется следующее сообщение:

отправка запроса GET на URL http://localhost:9091/api/test. Тело HTTP:

Проблема в том, что сервер никогда не получает запрос.

Добавление следующей строки:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.3]];

в конец основного метода решает эту проблему.

Мой вопрос:

Должен ли я выполнять вызовы ResKit API как NSOperation, а если нет, каковы мои альтернативы для выполнения вызовов в фоновом режиме?

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

1 Ответ

6 голосов
/ 17 июля 2011

Возможно, я не до конца понимаю общую проблему здесь ... Практически все, что делает RestKit в отношении загрузки ресурсов из сети, уже в фоновом режиме.Почти все уже асинхронно, и, таким образом, выполнение существующих асинхронных методов RestKit внутри NSOperation является дублирующим и контрпродуктивным.При этом, как только RestKit сообщит вам, что он завершил загрузку ваших данных (didLoadResponse), вы можете захотеть выполнить любую последующую постобработку в NSOperation, если эта часть требует значительных вычислительных ресурсов и не связана с UI.В противном случае, не пытайтесь перехитрить RestKit, просто запустите его, как в примерах, и вы хорошо справляетесь с асинхронным совершенством.

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

...