iOS多線程的簡(jiǎn)單用法

實(shí)現(xiàn)多線程的方式一般有三種:NSThread、GCD叹侄、NSOperation

1巩搏、NSThread:適用簡(jiǎn)單,簡(jiǎn)單易用,可以直接操作線程趾代,oc 的贯底,偶爾使用,程序員管理生命周期

//1.1 創(chuàng)建線程
//實(shí)例方法:創(chuàng)建線程后需手動(dòng)開啟線程
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument撒强;
//demo
NSThread* myThread = [[NSThread alloc] initWithTarget:self  
                                        selector:@selector(doSomething:)  
                                        object:nil];  
[myThread start];

//類方法:創(chuàng)建完成后直接運(yùn)行線程
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument禽捆;
//demo
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];  

//通知主線程更新UI
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];

//1.2 鎖
NSLock *theLock = [[NSLock alloc] init];  
//上鎖
[theLock lock];
//解鎖
[theLock unlock];  

2、GCD:替代 NSThread 等多線程技術(shù)飘哨,充分利用設(shè)備多核技術(shù)胚想,c的,經(jīng)常使用芽隆,系統(tǒng)自動(dòng)管理線程生命周期

//1浊服、常用的方法dispatch_async
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    // 耗時(shí)的操作  
    dispatch_async(dispatch_get_main_queue(), ^{  
        // 更新界面  
    });  
});  

//2、dispatch_group_async的使用
//dispatch_group_async可以實(shí)現(xiàn)監(jiān)聽一組任務(wù)是否完成胚吁,完成后得到通知執(zhí)行其他的操作牙躺。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
dispatch_group_t group = dispatch_group_create();  
dispatch_group_async(group, queue, ^{  
    [NSThread sleepForTimeInterval:1];  
    NSLog(@"group1");  
});  
dispatch_group_async(group, queue, ^{  
    [NSThread sleepForTimeInterval:2];  
    NSLog(@"group2");  
});  
dispatch_group_async(group, queue, ^{  
    [NSThread sleepForTimeInterval:3];  
    NSLog(@"group3");  
});  
dispatch_group_notify(group, dispatch_get_main_queue(), ^{  
    NSLog(@"updateUi");  
});  
dispatch_release(group); 

//當(dāng)三個(gè)線程都完成之后,group才會(huì)執(zhí)行
dispatch_group_notify(group, dispatch_get_main_queue(), ^{  
 
});  
//中的方法

//3腕扶、dispatch_barrier_async的使用
//dispatch_barrier_async是在前面的任務(wù)執(zhí)行結(jié)束后它才執(zhí)行孽拷,而且它后面的任務(wù)等它執(zhí)行完成之后才會(huì)執(zhí)行
//demo

dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);  
dispatch_async(queue, ^{  
    [NSThread sleepForTimeInterval:2];  
    NSLog(@"dispatch_async1");  
});  
dispatch_async(queue, ^{  
    [NSThread sleepForTimeInterval:4];  
    NSLog(@"dispatch_async2");  
});  
dispatch_barrier_async(queue, ^{  
    NSLog(@"dispatch_barrier_async");  
    [NSThread sleepForTimeInterval:4];  
  
});  
dispatch_async(queue, ^{  
    [NSThread sleepForTimeInterval:1];  
    NSLog(@"dispatch_async3");  
});

//運(yùn)行結(jié)果
//dispatch_async1
//dispatch_async2
//dispatch_barrier_async
//dispatch_async3

//4、dispatch_apply 使用
重復(fù)執(zhí)行同一段代碼蕉毯。
dispatch_apply(5, globalQ, ^(size_t index) {
    // 執(zhí)行5次
});

3乓搬、NSOperation:基于 gcd 的封裝,比 gcd 簡(jiǎn)單代虾,更加面向?qū)ο蠼希到y(tǒng)自動(dòng)管理線程生命周期,經(jīng)常使用

- (void)viewDidLoad  
{  
    [super viewDidLoad];  
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downloadImage:) object:kURL];  
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];  
    [queue addOperation:operation];  
    // Do any additional setup after loading the view, typically from a nib.  
}  
  
-(void)downloadImage:(NSString *)url{  
    NSLog(@"url:%@", url);  
    NSURL *nsUrl = [NSURL URLWithString:url];  
    NSData *data = [[NSData alloc]initWithContentsOfURL:nsUrl];  
    UIImage * image = [[UIImage alloc]initWithData:data];  
    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];  
}  
-(void)updateUI:(UIImage*) image{  
    self.imageView.image = image;  
} 

//n建一個(gè)NSInvocationOperatio線程棉磨,并且放到NSOperationQueue中江掩。后臺(tái)線程執(zhí)行downloadImage方法。方法完成后用performSelectorOnMainThread執(zhí)行主線程updateUI方法乘瓤。
//加入到NSOperationQueue的線程默認(rèn)全部同時(shí)進(jìn)行环形。若想做限制,可用此方法
[queue setMaxConcurrentOperationCount:5];
//默認(rèn)為-1衙傀,即無限制
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抬吟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子统抬,更是在濱河造成了極大的恐慌火本,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聪建,死亡現(xiàn)場(chǎng)離奇詭異钙畔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)金麸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門擎析,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挥下,你說我怎么就攤上這事揍魂。” “怎么了棚瘟?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵愉烙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我解取,道長(zhǎng)步责,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任禀苦,我火速辦了婚禮蔓肯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘振乏。我一直安慰自己蔗包,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布慧邮。 她就那樣靜靜地躺著调限,像睡著了一般舟陆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耻矮,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天秦躯,我揣著相機(jī)與錄音,去河邊找鬼裆装。 笑死踱承,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哨免。 我是一名探鬼主播茎活,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼琢唾!你這毒婦竟也來了载荔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤采桃,失蹤者是張志新(化名)和其女友劉穎身辨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芍碧,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡煌珊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泌豆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片定庵。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖踪危,靈堂內(nèi)的尸體忽然破棺而出蔬浙,到底是詐尸還是另有隱情,我是刑警寧澤贞远,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布畴博,位于F島的核電站,受9級(jí)特大地震影響蓝仲,放射性物質(zhì)發(fā)生泄漏俱病。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一袱结、第九天 我趴在偏房一處隱蔽的房頂上張望亮隙。 院中可真熱鬧,春花似錦垢夹、人聲如沸溢吻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽促王。三九已至犀盟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝇狼,已是汗流浹背阅畴。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留题翰,地道東北人恶阴。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓诈胜,卻偏偏與公主長(zhǎng)得像豹障,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子焦匈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • Object C中創(chuàng)建線程的方法是什么血公?如果在主線程中執(zhí)行代碼,方法是什么缓熟?如果想延時(shí)執(zhí)行代碼累魔、方法又是什么? 1...
    AlanGe閱讀 1,739評(píng)論 0 17
  • 多線程基本概念 單核CPU够滑,同一時(shí)間cpu只能處理1個(gè)線程,只有1個(gè)線程在執(zhí)行 。多線程同時(shí)執(zhí)行:是CPU快速的在...
    WeiHing閱讀 708評(píng)論 1 5
  • 偶天梯投,從掌閱中發(fā)現(xiàn)了桐華姐姐的《那些回不去的年少時(shí)光》况毅,那些……回不去……年少時(shí)光分蓖,是的,年少輕狂的青春歲月...
    木梓涂涂閱讀 351評(píng)論 1 2
  • 香港對(duì)于我來說么鹤,一直是一個(gè)特別的存在蒸甜。出生在靠近廣東省的廣西梧州迅皇,從小就耳濡目染了不少粵港文化衙熔,從小到現(xiàn)在對(duì)香港的...
    我愛呆萌佩閱讀 307評(píng)論 1 5
  • 窗外秋風(fēng)凄雨红氯,我站在窗前咕痛,光禿禿的樹枝向四面八方伸去茉贡。院里的一棵柿子樹上腔丧,二片紅透了的柿葉愉粤,頑強(qiáng)的留在樹梢上衣厘,隨風(fēng)...
    補(bǔ)丁_98f9閱讀 260評(píng)論 2 1