2012-07-10 33 views
1

我目前有一個UIViewController和一個NSObject類。如何將自我傳遞給對象類並在完成時調用?

我想要做的是告訴NSObject類執行一個操作,然後告訴UIViewController何時完成它的操作。

我打電話的對象執行它的作用就像這樣:

[fooObject performActionWithDelegate:self]; 

的performActionWithDelegate功能基本上只能採取UIViewController的代表進行回調。

-(void)performActionWithDelegate:(id)d{ 

    // bar is declared in the fooObject header file 
    // id bar; 

    [bar setDelegate:d]; 

    [bar performCallback]; 

} 

performCallback在UIViewController中一個簡單的NSLog()語句來:

-(void)performCallback{ 

    NSLog(@"Successfully performed a callback");  

{ 

現在,我想這個工作。我的第一個猜測是,這不是解決這個問題的最佳方法。

問題的全部範圍是fooObject應該執行一個httppost到webservice來更新它的一個屬性,然後通知uiviewcontroller操作是否成功。

我如何實現這一目標?

任何提示和/或指針將不勝感激!

在此先感謝。

編輯: 實際的問題是,fooObject沒有執行回調。

回答

0

它並不清楚你正在努力完成什麼。你在做什麼,似乎涉及到兩個不同的設計模式:

  • 代表
  • 異步回調

代表:如果有某種原因,分離出一些你會使用委託將UIViewController的功能轉換爲另一個對象。而不是UIViewController做的事情,它要求另一個對象去做。這通常用於代碼重用,因此您可以在不同情況下使用相同的UIViewController服務,只需更改委託即可更改其某些行爲。

異步回調:這允許在後臺進行操作,而你做其他事情,然後在操作完成時調用你對象的方法通知。你可以做到這一點,而不涉及其他對象。

就你而言,你爲什麼要在我們的UIViewController之外執行一個HTTP服務到Web服務?你只是想將網絡代碼與UI代碼分開嗎?在這種情況下,你並不真的需要一個委託,只需從你的UIViewController調用另一個對象的方法,當它返回時,就完成了。它可以在其他參數中傳回您需要的任何結果。通過設置調用對象的屬性來返回值通常不是一個很好的設計。即使你這樣做,UIViewController也不是真正的「委託」。

另一方面,如果您擔心在HTTP POST過程中阻塞主線程,那麼您將需要使用類似異步回調的方法。最簡單的方法是使用Grand Central Dispatch。從概念上講,你可以做這樣的事情:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [self doLongHTTPPost]; 
    dispatch_async(dispatch_get_main_queue(), ^{ [self longHTTPPostDone]; }); 
}); 

這將調用doLongHTTPPost在後臺,然後在一段時間以後它是完整的,它會調用longHTTPPostDone主線程它是安全的需要的用戶界面操作後。

+0

我試圖完成的原因是我只想讓UIViewcontroller處理演示文稿。沒有別的,我也發現有對象更新自己的好習慣。然後告訴視圖控制器顯示它們的新狀態。 是的,我不想阻止主線程。我會看看大中央派遣。感謝您的意見。 – doge 2012-07-10 07:49:17

+0

這聽起來很不錯。將網絡代碼放在某種實用程序或網絡管理器對象中,然後使用GCD不阻止主線程應該適合您。請注意,一旦您習慣了GCD,最簡單的方法就是在操作完成時傳遞該塊作爲回調。您會在較新的Apple框架中看到這個習慣用法。 – 2012-07-10 15:05:20