天天看點

iOS多線程GCD NSThread的使用和了解

多線程的知識點:

使用情況:耗時,不知道什麼會結束的情況,,需要與其他操作同步執行的操作,

遇到耗時的操作時,建立線程去執行,可以保證主線程流暢

主線程是其他線程的最終父線程 所有界面操作必須在主線程

背景線程無法操作ui和任何的使用者操作響應

建立一個新的線程都會消耗一定的記憶體和CPU時間,控制好線程順序

多個線程同時執行會出現搶奪資源的問題,要注意線程安全 

主線程堆棧大小1M 第二個是512kb

[NSThread currentThread] 中的num=1為主線程

線程異步,無法控制先後順序,,

以下寫出多線程常用的兩種方法,本人常用的是GCD,對于NSThread隻是了解,對于Cocoa operation不是太了解(最後一種不做解釋,有需要的自己查詢)

GCD

GCD常用 dispatch_async  防止頁面處理操作時出現卡頓,最常見的就是頁面資料重新整理,保證頁面流暢的情況下更新資料, 這個方法比其他線程操作流程更簡單,基于c語言的api ,結合block簡化了線程的操作 代碼架構如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        //資料擷取

        dispatch_async(dispatch_get_main_queue(), ^{

           //頁面更新

    });

});  

如果queue的類型設定為串行的類型,線程會産生死鎖

參數dispatch_queue_t queue隊列生成 

以上的線程的操作架構可以解決常見的基本的問題,可以直接使用,

如果對GCD有更深的需求和了解推薦幾篇文章,各路大神已經總結的很好了。如果英文足夠好可以看一下官方文檔,其他幾篇是對用法的總結

https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html#//apple_ref/doc/uid/TP40008079     GCD官方文檔

https://en.wikipedia.org/wiki/Grand_Central_Dispatch  GCD參考

http://www.cnblogs.com/madpanda/p/4694866.html GCD參考

http://blog.csdn.net/totogo2010/article/details/8016129 GCD參考

NSThread

優點:輕量級

缺點:需要自己管理線程生命周期,線程同步對資料的加鎖會對系統造成壓力

NSThread有兩種直接建立方式

- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

參數意義:

selector:線程執行方法,

target:selector消息發送的對象

argument:一般為nil

第一種方式會直接建立線程并且開始運作線程,第二種方式是先建立線程對象,然後再運作線程操作,在運作線程操作前可以設定線程的優先級等線程資訊

繼續閱讀