GCD - выполнение методов на заказ после завершения других - PullRequest
0 голосов
/ 01 октября 2011

У меня есть класс, который я вызываю несколько раз с разными данными.

Этот класс вызывает веб-сервис, анализирует его ответ на NSDictionary и сохраняет данные в Core Data.

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

Класс:

- (void)refreshDataFromWebService:(NSString *)webserviceWSDL 
{
    dispatch_queue_t receiveActivities = dispatch_queue_create("com.myApp.ws.wsdlMethod", NULL);
    dispatch_async(receiveData, ^(void)
    {
        //call web service
        //...

        //parse received data to NSDictionary
        //...
    });
    dispatch_release(receiveData);
}

//some work
//the class that works with the WS, calls a method on it's delegate, and the saveData is called.

- (void)saveData
{
    dispatch_queue_t request_queue = dispatch_queue_create("com.myApp.insertDataOnCoreData", NULL);
    dispatch_async(request_queue, ^{

    //save data to CoreData with new Manage Object Context
    //...
    //...
    });
    dispatch_release(request_queue);

}

Проблема в том, что мне нужно вызывать этот класс примерно 15 раз и в каком-то порядке.

Каков наилучший способ сделать это?

Должен ли я позвонить:

[SomeClass refreshDataFromWebService:method_1];

[SomeClass refreshDataFromWebService:method_2];

[SomeClass refreshDataFromWebService:method_3];

[SomeClass refreshDataFromWebService:method_4];

или я должен поступить иначе?

Цель состоит в том, чтобы method_2 вызывался только после того, как method_1 завершает сохранение в CoreData из-за взаимосвязей.

Спасибо за вашу драгоценную помощь,

Руи Лопес

Ответы [ 2 ]

2 голосов
/ 01 октября 2011

Ваш первый вызов для получения данных и последующего сохранения данных не будет работать ни в одном сценарии, когда для получения данных требуется больше времени, чем для сохранения данных, что, вероятно, почти всегда будет иметь место.Операция сохранения должна быть вызвана внутри блока приема в конце.Теперь для того, чтобы службы вызывались по одной за раз, вы должны создать ivar для очереди последовательной отправки для класса и использовать ее и только освободить ее в методе dealloc.Другой вариант - использовать NSOperation s с очередью, в которой максимальное число одновременных операций установлено в 1.

0 голосов
/ 01 ноября 2011

Почему бы вам просто не создать одну последовательную очередь для каждого экземпляра вашего класса, а затем сериализовать операции для внутренней очереди? Это будет гарантировать, что method_2 произойдет после method_1 (при условии, что method_1 был поставлен в очередь первым, по замыслу), в то же время позволяя всем экземплярам класса работать параллельно относительно друг друга. Это предполагает, конечно, что это ваша цель - по фрагменту кода это трудно понять.

...