GCD - 在完成其他操作后执行订单方法

时间:2011-09-30 20:18:37

标签: iphone ios multithreading core-data grand-central-dispatch

我有一个类,我用不同的数据多次调用。

该类调用Web服务,解析它对NSDictionary的响应,并将数据保存在Core Data上。

使用核心数据队列在不同的线程中完成对Web服务的调用和核心数据的保存,以便UI保持响应。

类别:

- (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_1因Core关系完成保存后才会调用method_2。

感谢您的宝贵帮助,

Rui Lopes

2 个答案:

答案 0 :(得分:2)

接收数据然后保存数据的第一次调用在接收数据所需的时间比调用保存数据的任何情况下都不起作用,这几乎总是如此。需要在结束时在接收块内部调用保存操作。现在,为了一次调用一个服务,你应该为类创建一个serial dispatch queue的ivar并使用它,并且只在dealloc方法中释放它。另一种选择是将NSOperations与最大并发操作设置为1的队列一起使用。

答案 1 :(得分:0)

为什么不简单地为类的每个实例创建一个串行队列,然后针对内部队列序列化操作?这将确保method_2在method_1之后发生(假设method_1首先按设计排队),同时仍然允许类的所有实例相互并行运行。当然,这假设这是你的目标 - 很难从相关的代码片段中分辨出来。