2012-03-03 51 views
0

我有一個對象有一個方法,它在幾秒鐘之後通過委託方法返回結果。我明白,如果我在使用GCD的另一個線程上執行此操作,我可以提高我的UI性能,但是在主線程上運行的對象上實現的委託方法如何?使用GCD在iOS 5上管理代表,如何操作?

所以這一切都發生在主線程:

在頭文件:

@interface MyViewController : UIViewController <ThisRespondsToSomeDelegate> 

在視圖控制器的實現文件:

SomeObject _myDealer; // INSTANCE VARIABLE OF THE OBJECT THAT IMPLEMENTS THE ThisRespondsToSomeDelegate TYPE 

後來在同實施文件:

[_myDealer getSomeData]; 

後來,委託方法:

-(void)myDealerReturnedSomeData:data anotherArg:(id)somemoredata {...}; 

據我瞭解,我創建了一個* background_queue *與* dispatch_queue_create *方法比使用對象:

dispatch_async(backgroundQueue, ^(void) { [_myDealer getSomeData]; }); 

但我怎麼回到主線程上的委託方法? myDealerReturnedSomeData:數據如何被調用?

謝謝!

快樂編碼!

+1

你的問題有點不清楚。 * 1. *哪個類下載數據並提供委託協議? * 2. *哪個類實現委託協議?我猜'MyViewController'實現了委託協議,'SomeObject'是一個執行簡單任務並提供委託的類。常見的模式是'SomeObject'從其內部調用委託(一旦它完成任務),所以'dispatch_async()'將在'SomeObject'的實現中被調用... – ayoy 2012-03-03 17:12:42

回答

0

要調用一個主線程的方法的背景GCD任務完成後,只需派遣它的一個功能塊到主隊列的後臺任務執行完畢後:

// this runs in background 
dispatch_async(backgroundQueue, ^{ 
    [_myDealer getSomeData]; 

    // once the code above returns you schedule a block on the main queue: 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.delegate myDealderReturnedSomeData:[_myDealer someData] anotherArg:...]; 
    }); 
}); 
+0

但是委託方法參數在裏面生成_myDealer實例,更準確地說getSomeData方法內部,當我調用self.dekegate時,如何訪問...? – 2012-03-03 16:57:41

+0

我編輯了我的答案,以表明您可以在嵌套塊中自由訪問_myDealer。它僅在'getSomeData'返回後調用。 – ayoy 2012-03-03 17:11:01

+0

如果參數不是_mydealer的實例變量,而是getSomeData方法中的變量呢? – 2012-03-03 17:59:05