NSThread:
–優(yōu)點(diǎn):NSThread 比其他兩個(gè)輕量級星瘾,使用簡單
–缺點(diǎn):需要自己管理線程的生命周期、線程同步省容、加鎖冬三、睡眠以及喚醒等。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷
?NSOperation:
–不需要關(guān)心線程管理缘缚,數(shù)據(jù)同步的事情勾笆,可以把精力放在自己需要執(zhí)行的操作上
–NSOperation是面向?qū)ο蟮?/p>
?GCD:
–Grand Central Dispatch是由蘋果開發(fā)的一個(gè)多核編程的解決方案。iOS4.0+才能使用桥滨,是替代NSThread窝爪, NSOperation的高效和強(qiáng)大的技術(shù)
1. NSThread的多線程技術(shù):
[NSThread detachNewThreadSelector:@selector(bigDemo) toTarget:self withObject:nil];//類方法不用自己開啟
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(bigDemo)object:nil]; //成員方法啟動start線程[thread start];
對于NSThread的簡單使用弛车,可以用NSObject的performSelectorInBackground替代:[self performSelectorInBackground:@selector(function) withObject:nil];
同時(shí) 在NSThread調(diào)用的方法中,同樣要使用autoreleasepool進(jìn)行內(nèi)存管理蒲每,否則容易出現(xiàn)內(nèi)存泄露纷跛。
//自動釋放池
//負(fù)責(zé)其他線程上的內(nèi)存管理,在使用NSThread或者NSObject的線程方法時(shí)邀杏,一定要使用自動釋放池
//否則容易出現(xiàn)內(nèi)存泄露贫奠。
@autoreleasepool {
}
2 NSOperation,面向?qū)ο蟮亩嗑€程技術(shù)
//實(shí)例化操作隊(duì)列
_queue = [[NSOperationQueue alloc] init];
//控制同時(shí)最大并發(fā)的線程數(shù)量
[_queue setMaxConcurrentOperationCount:2];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opAction)object:nil]; 或者
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
}];
//添加操作之間的依賴關(guān)系望蜡,所謂“依賴”關(guān)系唤崭,就是等待前一個(gè)任務(wù)完成后,后一個(gè)任務(wù)才能啟動
//依賴關(guān)系可以跨線程隊(duì)列實(shí)現(xiàn)
//提示:在指定依賴關(guān)系時(shí)脖律,注意不要循環(huán)依賴谢肾,否則不工作。
[operation2 addDependency:operation1]小泉;
[operation3 addDependency:operation2];
將操作添加到隊(duì)列NSOperationQueue即可啟動多線程執(zhí)行
[_queue addOperation:operation];
[NSOpeationQueue mainQueue] addOperation^{
? //刷新UI
};
3. GCD
//全局隊(duì)列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
串行隊(duì)列
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
//主隊(duì)列
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"main - > %@", [NSThread currentThread]);
});
// group隊(duì)列使用
dispatch_queue_t dispatchQueue = dispatch_queue_create("hah.next", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t dispatchGroup=dispatch_group_create();
dispatch_group_async(dispatchGroup, dispatchQueue,^(){
NSLog(@"dispatch-1");
});
dispatch_group_async(dispatchGroup, dispatchQueue,^(){
NSLog(@"dspatch-2");
});
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(),^(){
NSLog(@"end"); //異步任務(wù)無序 芦疏,最后執(zhí)行這個(gè)任務(wù)
});