Сериализация вызовов и обратных вызовов веб-сервиса
У меня есть класс, который отправляет вызовы веб-службы и доставляет ответ через делегирование. Теперь я хочу добавить слой кэширования между представлениями и моим классом веб-сервиса. Этот новый класс должен сериализовать вызовы таким образом, чтобы каждый вызов откладывался до завершения обратного вызова предыдущего вызова.
Я пытался понять это с помощью GCD:
- (void)callWebserviceFunctionX {
dispatch_group_notify(self.serviceGroup, self.serialQueue, ^{
dispatch_group_enter(self.serviceGroup);
// call webservice
});
}
И в обратном вызове:
-(void)callbackFunctionXWithResponse:(id)response {
// do something
dispatch_group_leave(self.serviceGroup);
}
Идея сгруппировать каждый звонок и его обратный вызов dispatch_group_enter
а также dispatch_group_leave
и ждать, пока предыдущие группы не dispatch_group_notify
,
Тем не менее, этот подход, похоже, не работает, как я планировал. Есть ли лучший способ добиться этого?
ОБНОВИТЬ:
Я перепробовал каждую комбинацию dispatch_group_enter
, dispatch_group_leave
, dispatch_group_notify
а также dispatch_group_async
Я могу думать без успеха.
Я тоже думал о NSOperation
а также NSOperationQueue
, но - если я правильно понял - это заставило бы меня написать отдельный класс для каждого вызова веб-службы.
Есть ли другая альтернатива, о которой я еще не думал?
2 ответа
Я думаю, что вам лучше использовать NSOperation, зависимости между ними для обеспечения сериализации и NSOperationQueue для их запуска.
Чтобы избежать создания подкласса NSOperation для каждого запроса, вы можете использовать встроенный NSBlockOperation, вы предоставляете блок для каждого экземпляра, и добавление зависимостей между экземплярами NSBlockOperation должно дать вам целевую сериализацию.
Надеюсь это поможет.
С уважением
Вы можете использовать MKNetworkKit в качестве сетевого решения. Это использует NSOperationQueue под капотом, и вы можете использовать зависимости NSOperation для сериализации вашего запроса / ответов. MKNetworkKit также поддерживает кэширование ответов, поэтому может также помочь с вашей реализацией кэширования.
MKNetworkKit Обзор
http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/
У кого-то была похожая проблема при использовании MKNetworkKit и GCD
MKNetworkKit и GCD dispatch_group_t