Выполнение RestKit как NSOperartion

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

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

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

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

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

Мой вопрос:

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

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


person lucasweb    schedule 06.06.2011    source источник


Ответы (1)


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

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

person Greg Combs    schedule 17.07.2011
comment
См. это: stackoverflow.com/questions/13885295/ - person quantumpotato; 23.05.2013
comment
Начиная с Restkit 0.20, методы завершения запроса службы, такие как request:didLoadResponse:, request:didLoadError:, objectLoader:didLoadObjects: и objectLoader:didLoadError:, были заменены блоками завершения в классах AFHTTPRequestOperation и RKObjectRequestOperation. - person prodeveloper; 23.06.2014