iOS 關(guān)于多線程

NSThread####

(每個NSThread對象對應(yīng)一個線程算撮,真正的多線程)

  • 使用NSObject類的方法performSelectorInBackground:withObject:來創(chuàng)建一個線程譬巫。
    [Object performSelectorInBackground:@selector(doSomething:) withObject:nil];

    對應(yīng)的在主線程上調(diào)用的方法的(更新UI必須回到主線程):
    [Object performSelectorOnMainThread:@selector(doSomething:) withObject:nil waitUntilDone:NO];
    
  • 選擇使用NSThread實現(xiàn)多線程庞溜。
    NSThread創(chuàng)建主要有兩種方式:

    1:[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
    
    2:NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
     [myThread start];
    
    這兩種方式的區(qū)別在于:
    前一種調(diào)用就會立即創(chuàng)建一個線程并執(zhí)行selector方法赖淤;第二種方式盡管alloc了一個新Thread管搪,
    但需要手動調(diào)用start方法來啟動線程谆构。這點與Java創(chuàng)建線程的方式相似裸扶。
    第一種方式,與上述做法1使用NSObject的類方法performSelectorInBackground:withObject:是一樣的搬素;
    第二種方式的可以在start真正創(chuàng)建線程之前對其進行設(shè)置呵晨,比如設(shè)置線程的優(yōu)先級。
    

還有要注意的是在多個線程都在執(zhí)行同一個方法的時候要使用線程鎖NSLock
我們可以使用指令 @synchronized 來簡化 NSLock的使用熬尺,這樣我們就不必顯示編寫創(chuàng)建NSLock,加鎖并解鎖相關(guān)代碼摸屠。
- (void)doSomeThing:(id)anObj{
@synchronized(anObj) {
// Everything between the braces is protected by the @synchronized directive.
}}


Grand Central Dispatch (GCD)####

  • The main queue:主隊列,串行隊列
    main queue可以調(diào)用dispatch_get_main_queue()來獲得粱哼。因為main queue是與主線程相關(guān)的季二,所以這是一個串行隊列。
    dispatch_async(dispatch_get_main_queue(), ^{ // something });

  • Global queues: 全局隊列皂吮,并發(fā)隊列(后臺執(zhí)行)
    進程中存在三個全局隊列:高戒傻、中(默認(rèn))、低三個優(yōu)先級隊列(實際還有一個更低優(yōu)先級為DISPATCH_QUEUE_PRIORITY_BACKGROUND)蜂筹⌒枘桑可以調(diào)用dispatch_get_global_queue函數(shù)傳入優(yōu)先級來訪問隊列。
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // something });

***需要注意的是艺挪,三個隊列不代表三個線程不翩,可能會有更多的線程。并發(fā)隊列可以根據(jù)實際情況來自動產(chǎn)生合理的線程數(shù)麻裳,也可理解為dispatch隊列實現(xiàn)了一個線程池的管理口蝠,對于程序邏輯是透明的。 ***

  • 用戶隊列
    用戶隊列 (GCD并不這樣稱呼這種隊列, 但是沒有一個特定的名字來形容這種隊列津坑,所以我們稱其為用戶隊列) 是用函數(shù) dispatch_queue_create創(chuàng)建的隊列. 這些隊列是串行的妙蔗。

    dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL); 
    dispatch_async(queue, ^{ // something });
    //生成一個串行隊列,隊列中的block按照先進先出(FIFO)的順序去執(zhí)行疆瑰,實際上為單線程執(zhí)行眉反。第一個參數(shù)是隊列的名稱昙啄,在調(diào)試程序時會非常有用,所有盡量不要重名了寸五。  
    
    dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT); 
    dispatch_async(queue, ^{ // something });  
    //生成一個并發(fā)執(zhí)行隊列梳凛,block被分發(fā)到多個線程去執(zhí)行  
    
    
    例子:多線程寫同一數(shù)據(jù)庫,需要保持寫入的順序和每次寫入的完整性梳杏,簡單地利用串行隊列即可實現(xiàn):
    dispatch_queue_t queue1 = dispatch_queue_create("com.dispatch.writedb", DISPATCH_QUEUE_SERIAL);  
    
    - (void)writeDB:(NSData *)data  {  
        dispatch_async(queue1, ^{  
           //write database  
        });  
    }    
    下一次調(diào)用writeDB:必須等到上次調(diào)用完成后才能進行韧拒,保證writeDB:方法是線程安全的。 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末十性,一起剝皮案震驚了整個濱河市叛溢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烁试,老刑警劉巖雇初,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異减响,居然都是意外死亡靖诗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門支示,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刊橘,“玉大人,你說我怎么就攤上這事颂鸿〈倜啵” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵嘴纺,是天一觀的道長败晴。 經(jīng)常有香客問我,道長栽渴,這世上最難降的妖魔是什么尖坤? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮闲擦,結(jié)果婚禮上慢味,老公的妹妹穿的比我還像新娘。我一直安慰自己墅冷,他們只是感情好纯路,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寞忿,像睡著了一般驰唬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腔彰,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天定嗓,我揣著相機與錄音蜕琴,去河邊找鬼萍桌。 笑死宵溅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的上炎。 我是一名探鬼主播恃逻,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼藕施!你這毒婦竟也來了寇损?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤裳食,失蹤者是張志新(化名)和其女友劉穎矛市,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诲祸,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡浊吏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了救氯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片找田。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖着憨,靈堂內(nèi)的尸體忽然破棺而出墩衙,到底是詐尸還是另有隱情,我是刑警寧澤甲抖,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布漆改,位于F島的核電站,受9級特大地震影響准谚,放射性物質(zhì)發(fā)生泄漏挫剑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一氛魁、第九天 我趴在偏房一處隱蔽的房頂上張望暮顺。 院中可真熱鬧,春花似錦秀存、人聲如沸捶码。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惫恼。三九已至,卻和暖如春澳盐,著一層夾襖步出監(jiān)牢的瞬間祈纯,已是汗流浹背令宿。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腕窥,地道東北人粒没。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像簇爆,于是被迫代替她去往敵國和親癞松。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容