2009-12-05 19 views
0

我一直在網上搜索這個問題的答案,但無法找到答案,另一方面,我認爲這是相當普遍的事情,因此有可能我在這裏丟失了一些關鍵字。總之,問題如下:什麼時候Cocoa回調給定controll?

什麼時候在ObjC(iPhone)中給回調函數賦予控件?

這是否發生在層次結構類中負責控制runloop的控件之後?它可能發生在正在執行的另一個函數調用的中間嗎?

舉個例子,讓我們的NSURLConnection的,我們不知道或不能預測它什麼時候打電話didReceiveResponse或其它回調方法,它可以是這樣的情況didReceiveResponse獲取的所謂當我處於另一個功能的中間時? (高度懷疑,但未能找到回調瓦亭的運行循環結束信息)

乾杯, 卡斯帕

回答

4

可以把它的情況是 didReceiveResponse GET時 我在另一個函數中我叫?

不,在單個線程中,代碼不會並行執行。 runloop安排所有消息的執行並按順序分派它們。即使是NSTimers也不能保證它們在理論上能夠達到的精度,因爲它們必須像其他所有事情一樣等待runloop。

+0

在這種情況下,那麼我認爲NSURLConnection的不產生新線程(之前像我想)在引擎蓋下。它如何實現異步性? 我還想了解更多信息,CocoaTouch中的哪個類負責運行循環? – Kaspa 2009-12-08 09:16:26

+0

該類是NSRunloop.NSURLConnection有幾種管理與線程和runloops交互的方法。我不相信它真的像異步操作一樣使用硬件中斷的設備驅動程序。相反,這是一個問題或仔細安排。 – TechZen 2009-12-08 14:35:49

1

的回調將不會從你的函數的中間被調用,確實如此。您必須控制主循環以處理事件,並調用回調函數。

如果您想知道究竟是誰在調用回調函數,請在其中放入一個斷點,然後檢查堆棧跟蹤。

0

didreceivereponse將被調用,而其他事情正在執行的唯一時間是如果你已經在它自己的線程(通常在NSOperation)上啓動連接。

這就是爲什麼當你有在後臺線程的連接,通常使用類似performSelectorInMainThread更改數值爲應用程序的其他部分 - 雖然你可以調整的屬性直接,如果他們都沒有標註非原子和是不可變的集合。

0

默認情況下,基本上所有可可觸摸類完全在單個線程中工作,包括許多異步操作,如後臺網絡調用。主要的例外是NSOperation和朋友,以及與NSThread相關的東西。

操作系統可以通過在迴路計劃中插入其回調來完成此操作。還有一些情況是您的一個調用也會導致在同一個堆棧上進行回調 - 例如,如果在通知其代理的對象(如UITextField)上調用resignFirstResponder。

一對夫婦相關博客文章:

相關問題