2011-09-30 71 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

相關問題