【问题标题】:GCD - executing methods on order after finishing othersGCD - 在完成其他方法后按顺序执行方法
【发布时间】:2011-09-30 20:18:37
【问题描述】:

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

该类调用一个网络服务,解析它对 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_2仅在method_1完成保存CoreData后调用,由于关系。

感谢您的宝贵帮助,

瑞洛佩斯

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • @Jow 该过程现在正在运行,就像我在上面显示的那样。调用WS的Class,解析响应后调用方法保存数据。我会更新我的帖子,以便清楚。谢谢。
    • 所以你说的是:dispatch_queue_t queue; queue = dispatch_queue_create("com.example.MyQueue", NULL);dispatch_async(myQueue, ^{ //调用 method1, method2, ... });这是正确的吗?
    【解决方案2】:

    您为什么不简单地为您的类的每个实例创建一个串行队列,然后针对内部队列对操作进行串行化?这将确保method_2 发生在method_1 之后(假设method_1 在设计上首先入队),同时仍然允许类的所有实例彼此并行运行。当然,这假设这是您的目标 - 从有问题的代码片段中很难判断。

    【讨论】:

    • 这就是目标。我有几个课程,每个我需要的方法一个。我需要的是了解如何使用 GCD(后台),依次调用所有类(大约 10 个),尊重顺序,并在 3 完成后运行第 4 类。
    • 好吧,使用分派信号量,您总是可以让操作明确地等待他们依赖的东西首先完成,但几乎总是一个糟糕的设计需要这样做。相比之下,一个好的设计是让类 3 将调用作为完成回调分派给类 4,从而使排序更加明确。另一种设计是将队列视为最顶层的组织模型,而不是按类/方法分离操作,而是按这些操作入队的队列。
    猜你喜欢
    • 1970-01-01
    • 2020-01-27
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多