2011-09-30 42 views
-1

我有一个类可以用不同的数据多次调用。GCD - 在完成其他人后执行方法

该类调用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在CoreData上完成保存后调用method_2,这是由于关系。

感谢您的宝贵帮助,

锐洛佩斯

回答

2

你的第一个电话来接收数据,然后保存的数据将不会在其需要更长的时间比它调用保存接收数据的情况下工作这些数据可能几乎总是如此。保存操作需要在最后的接收块内部调用。现在为了一次调用一个服务,您应该为该类创建一个serial dispatch queue的ivar并使用它,并且只在dealloc方法中释放它。另一个选择是使用NSOperations,并将最大并发操作设置为1的队列。

+0

@Jow这个过程现在就像我上面展示的那样工作。调用WS的Class调用解析响应后保存数据的方法。我会更新我的帖子,使其变得清晰。谢谢。 –

+0

所以你所说的是:dispatch_queue_t queue; queue = dispatch_queue_create(“com.example.MyQueue”,NULL); dispatch_async(myQueue,^ {call method1,method2,... }); 这是正确的吗? –

0

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

+0

这就是目标。我有几个类,每个类需要一个。我需要的是了解如何使用GCD(背景),在3完成之后,一个接一个地调用所有类(约10个),遵守顺序并且运行4级。 –

+0

那么,使用调度信号量,你总是可以让操作明确地等待他们依赖的东西先完成,但它几乎总是一个不好的设计,需要这样做。相比之下,一个好的设计就是让第3类调用到第4类的调用作为完成回调,使得排序更加明确。另一种设计是将队列视为最高级别的组织模型,而不是按类/方法分隔操作,而是按照这些操作排队的队列。 – jkh

相关问题