Сериализация вызовов и обратных вызовов веб-сервиса

У меня есть класс, который отправляет вызовы веб-службы и доставляет ответ через делегирование. Теперь я хочу добавить слой кэширования между представлениями и моим классом веб-сервиса. Этот новый класс должен сериализовать вызовы таким образом, чтобы каждый вызов откладывался до завершения обратного вызова предыдущего вызова.

Я пытался понять это с помощью 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

Другие вопросы по тегам