iOS 開發小記 (九)

來源:互聯網
上載者:User

標籤:

1,GCD的Concurrent、Serial queues

Concurrent queues (also known as a type of global dispatch queue) execute one or more tasks concurrently, but tasks are still started in the order in which they were added to the queue. The currently executing tasks run on distinct threads that are managed by the dispatch queue. The exact number of tasks executing at any given point is variable and depends on system conditions.

並發隊列用來並發執行一個或者多個任務,但是任務還是按照添加進隊列的順序開始。由並發隊列來管理在不同線程執行的任務。並發執行的任務數是動態,取決於系統的條件。 

Serial queues (also known as private dispatch queues) execute one task at a time in the order in which they are added to the queue. The currently executing task runs on a distinct thread (which can vary from task to task) that is managed by the dispatch queue.串列隊列按照添加順序執行任務。 The kernel creates additional threads when workunits on existing GCD worker threads for a global concurrent queue are blocked in the kernel for a significant amount of time (as long as there is further work pending on the global queue).當並發隊列裡面的任務阻塞時間過長的時候,系統會建立新的線程來執行後面的任務,因為後面還有很多任務在等待。 dispatch_barrier_async 屏障,等待前面的完成。dispatch_semaphore_wait簡單來說就是GCD的非同步隊列是為了儘快執行,那麼如果有block阻塞了,那麼會建立一個新的線程。如果不希望有太多的線程,那麼可以用同步隊列,

concurrent queues和main queue 都是由系統產生而且 dispatch_suspend, dispatch_resume, dispatch_set_context,這些函數對他們無效 

 

2,線程間通訊

Mach Port 
在蘋果的Thread Programming Guide的Run Pool一節的Configuring a Port-Based Input Source 這一段中就有使用Mach Port進行線程間通訊的例子。 其實質就是父線程建立一個NSMachPort對象,在建立子線程的時候以參數的方式將其傳遞給子線程,這樣子線程中就可以向這個傳過來的 NSMachPort對象發送訊息,如果想讓父線程也可以向子線程發訊息的話,那麼子線程可以先向父線程發個特殊的訊息,傳過來的是自己建立的另一個 NSMachPort對象,這樣父線程便持有了子線程建立的port對象了,可以向這個子線程的port對象發送訊息了。

當然各自的port對象需要設定delegate以及schdule到自己所線上程的RunLoop中,這樣來了訊息之後,處理port訊息的delegate方法會被調用,你就可以自己處理訊息了。   3,RUN LOOP

如果你使用過select系統調用寫過程式你便可以快速的理解runloop事件來源的概念,本質上講事件來源的機制和select一樣是一種多工IO的 實現,在一個線程中我們需要做的事情並不單一,如需要處理定時鐘事件,需要處理使用者的觸控事件,需要接受網路遠端發過來的資料,將這些需要做的事情統統注 冊到事件來源中,每一次迴圈的開始便去檢查這些事件來源是否有需要處理的資料,有的話則去處理。 拿具體的應用舉個例子,NSURLConnection網路資料請求,預設是非同步方式,其實現原理就是建立之後將其作為事件來源加入到當前的 RunLoop,而等待網路響應以及網路資料接受的過程則在一個新建立的獨立的線程中完成,當這個線程處理到某個階段的時候比如得到對方的響應或者接受完 了網路資料之後便通知之前的線程去執行其相關的delegate方法。所以在Cocoa中經常看到scheduleInRunLoop:forMode: 這樣的方法,這個便是將其加入到事件來源中,當檢測到某個事件發生的時候,相關的delegate方法便被調用。對於CoreFoundation這一層而 言,通常的模式是建立輸入源,然後將輸入源通過CFRunLoopAddSource函數加入到RunLoop中,相關事件發生後,相關的回呼函數會被調 用。如CFSocket的使用。 另外RunLoop中還有一個運行模式的概念,每一個運行迴圈必然運行在某個模式下,而模式的存在是為了過濾事件來源和觀察者的,只有那些和當前 RunLoop運行模式一致的事件來源和觀察者才會被啟用。

 每一個線程都有其對應的RunLoop,但是預設非主線程的RunLoop是沒有啟動並執行,需要為RunLoop添加至少一個事件來源,然後去run它。一般情況下我們是沒有必要去啟用線程的RunLoop的,除非你在一個單獨的線程中需要長久的檢測某個事件。  4,view hierarchy viewDidLoad 此方法在view被  addsubWiew後調用viewDidLoad用於初始化,載入時用到的。 (不論是從xib中載入視圖,還是從loadview產生視圖,都會被調用。) loadView 此方法在控制器的view為nil的時候被調用。 此方法用於以編程的方式建立view的時候用到。 loadView是使用代碼產生視圖的時候,當視圖第一次載入的時候調用的方法。用於使用(寫)代碼來實現控制項。用於使用代碼產生控制項的函數。 果裝置記憶體不足的時候, view 控制器會收到didReceiveMemoryWarning的訊息。 預設的實現是檢查當前控制器的view是否在使用。如果它的view不在當前正在使用的view hierarchy裡面,且你的控制器實現了loadView方法, 那麼這個view將被release, loadView方法將被再次調用來建立一個新的view。   view hierarchy同時也是responder chain的重要部分,當我們需要渲染window中的內容的時候,應用程式的架構會用它來檢測views的layer的層次,來決定需要渲染的部分,從而來避免做一些無用功,這點至關重要。  

在開發的時候,有時候會遇到

1.ios attempt to present whose view is not in the window hierarchy

2.Warning: Attempt to present on whose view is not in the window hierarchy!

等等這樣類似的提示,只要裡面提示有 window hierarchy,都是view hierarchy的理解不到位導致的。

上面的問題都是在一個controller的view還沒加到window上的時候又取present另外一個controller,這就相當於在蓋樓,2樓還沒蓋完,直接去蓋3樓了,這樣肯定是不行。

 遇到上面的問題 最直接的解決方案就是在controller的viewDidAppear裡面去調用present。這樣可以確保view hierarchy的階層不亂。    

iOS 開發小記 (九)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.