多線程的知識點:
使用情況:耗時,不知道什麼會結束的情況,,需要與其他操作同步執行的操作,
遇到耗時的操作時,建立線程去執行,可以保證主線程流暢
主線程是其他線程的最終父線程 所有界面操作必須在主線程
背景線程無法操作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
第一種方式會直接建立線程并且開始運作線程,第二種方式是先建立線程對象,然後再運作線程操作,在運作線程操作前可以設定線程的優先級等線程資訊