2009-12-04 104 views
0

我有一個模式視圖控制器,它在自己的上下文中創建核心數據更改,當我單擊完成時,它會保存更改(調度合併更改通知),通知委託並解散。在延遲後在對象上調用委託方法

我的問題是,我需要委託收到我的主要上下文與編輯上下文的變化合並後的消息。我希望委託調用在下一次運行循環中進行,但是我遇到了對象生命週期的問題。我想到了以下內容:

  1. 撥打電話[delegate performSelector:withObject:afterDelay:]但是看起來好像該郵件無法識別。我的委託符合NSObject協議,但不包括具有延遲的執行選擇器。
  2. 在我的視圖控制器中創建一個方法:informDelegateWithObject:,它調用委託方法,並在延遲後調用該方法。即[self performSelector:@selector(informDelegateWithObject:) withObject:.. afterDelay:..]。然而,這可以工作,因爲我的視圖控制器正在被解僱,如果延遲幾秒鐘,那麼它會從內存中釋放,並不會導致崩潰,當涉及到調用?
  3. 創建一個NSInvocation的實例。我曾經想過,但是,這個對象的壽命是多少?如果我使用[NSInvocation invocationWithMethodSignature:]創建它,那麼NSInvocation對象不會被自動發佈,並且不會在下一個運行循環中出現?別說幾秒鐘了。當我的模式視圖控制器被解散和釋放時,我無法將調用對象存儲在我的視圖控制器中。

有什麼建議嗎?

回答

1

您應該將上下文合併到委託中。假設你按下保存到你的模態控制器:你將發送一個myViewController:didFinishSaving:給委託。

此代理進入myViewController:didFinishSaving:實現將保存,合併和解除模態視圖控制器。

我希望我明白你的問題。 再見! :)

+0

感謝您的回覆。實際上我有一個不同的模式,它是一個相當複雜的應用程序,我的EVC(編輯視圖控制器)從多個地方調用,因此可以有多個代表。上下文和保存都完全由EVC處理。我真的只是想知道在延遲之後調用方法的最佳方法,並且問題中描述的對象生存期問題。有任何想法嗎? – 2009-12-04 10:57:05

+0

你仍然可以使用我的模式。 在myViewController:didFinishSaving:實現中,您可以調用myViewController上的方法...像[myViewController saveAndMergeWithMO​​C:self.managedObjectContext],然後關閉。 說到延遲調用選擇器... 我看到沒有錯誤使用performSelector:withObject:afterDelay :.如果你想壓制編譯器的警告,你可以定義一個包含該方法的協議。 在任何情況下,它必須工作,因爲UIViewController繼承自NSObject,並且@selector(performSelector:withObject:afterDelay :)將被Objective-C運行時找到 – muccy 2009-12-04 11:48:02

1

你可能會看看蘋果公司的核心數據Books教程,它沿着muccy描述的方向工作。在模式視圖關閉並且控制返回到父視圖控制器之後發生保存。父代包含更新代碼並觸發合併更改所需的通知(無論是在代理還是其他地方發生)。

+0

感謝您的迴應,以及您對我的其他問題的幫助這裏:-)正如我在muccy的回答中提到的,我使用的是一個稍微不同的模式,它是一個相當複雜的應用程序,我的編輯視圖控制器整齊地處理編輯上下文和保存。我真的只是想知道在延遲之後調用方法的最佳方法,並且問題中描述的對象生存期問題。有任何想法嗎? – 2009-12-04 10:57:57

0

您也可以聲明委託這樣的:

NSObject <MyClassDelegateProtocol> *delegate; 

那麼你的委託也將是一個NSObject符合您的協議。

1

對於問題#1:performSelector:withObject:afterDelay:是在NSObject類中定義的,而不是NSObject協議。你使用的任何對象可能都是NSObject的一個實例。您可能指的是由靜態類型檢查導致的編譯器警告。 (從技術上講,符合NSObject協議的對象可能不是NSObject; NSProxy就是一個例子,但你通常使用的任何對象都是NSObject)。你可以忽略這個警告(在Objective-C中,你可以嘗試發送任何消息給任何對象)。或者,如果你願意,你可以將它投射到id(它允許你發送任何沒有任何警告的消息)或者NSObject *

問題#2:「如果延遲時間是幾秒鐘,那麼它將從內存中釋放」否,performSelector:withObject:afterDelay:的文檔中說「此方法保留接收器和anArgument參數,直到執行選擇器爲止」。