日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)

發(fā)布時(shí)間:2024/7/19 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS开发-多线程编程技术(Thread、Cocoa operations、GCD) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)介

在軟件開(kāi)發(fā)中,多線程編程技術(shù)被廣泛應(yīng)用,相信多線程任務(wù)對(duì)我們來(lái)說(shuō)已經(jīng)不再陌生了。有了多線程技術(shù),我們可以同做多個(gè)事情,而不是一個(gè)一個(gè)任務(wù)地進(jìn)行。比如:前端和后臺(tái)作交互、大任務(wù)(需要耗費(fèi)一定的時(shí)間和資源)等等。也就是說(shuō),我們可以使用線程把占據(jù)時(shí)間長(zhǎng)的任務(wù)放到后臺(tái)中處理,而不影響到用戶的使用。

?

?

線程間通訊

有一個(gè)非常重要的隊(duì)列,就是主隊(duì)列。在這個(gè)隊(duì)列中處理多點(diǎn)觸控及所有與UI相關(guān)操作等等。它非常特殊,原因有兩點(diǎn)。一是我們絕對(duì)不想它阻塞,我們不會(huì)將需要執(zhí)行很長(zhǎng)時(shí)間的任務(wù)放在主隊(duì)列上執(zhí)行。二是我們將其用于所有與UI相關(guān)的同步,也就是線程間通訊需要注意的地方。所有有可能會(huì)使屏幕UI發(fā)生變化的,都應(yīng)放在主隊(duì)列上執(zhí)行。

?

線程的定義:

每個(gè)正在系統(tǒng)上運(yùn)行的程序都是一個(gè)進(jìn)程。每個(gè)進(jìn)程包含一到多個(gè)線程。進(jìn)程也可能是整個(gè)程序或者是部分程序的動(dòng)態(tài)執(zhí)行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨(dú)立執(zhí)行。也可以把它理解為代碼運(yùn)行的上下文。所以線程基本上是輕量級(jí)的進(jìn)程,它負(fù)責(zé)在單個(gè)程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負(fù)責(zé)多個(gè)線程的調(diào)度和執(zhí)行。

轉(zhuǎn)自百度百科:多線程

?

如果熟悉多線程編程技術(shù)這一塊的朋友們,可以去看關(guān)于多線程安全的文章,是我寫(xiě)的另一篇文章”iOS開(kāi)發(fā)-多線程開(kāi)發(fā)之線程安全篇“;

?

IOS支持的多線程技術(shù):

一、Thread:

1)顯式創(chuàng)建線程:NSThreed

2)隱式創(chuàng)建線程:NSObject

二、Cocoa?operations:

NSOperation類是一個(gè)抽象類,因?yàn)槲覀儽仨毷褂盟膬蓚€(gè)子類。

  1)NSInvocationOperation?

2)NSBlockOperation

————————————————————————————

3)NSOperationQueue(繼承于NSObject)

三、Grand Central Dispatch (GCD):

1)GCD的創(chuàng)建

2)重復(fù)執(zhí)行線程及一次性執(zhí)行:dispatch_apply?&?dispatch_once

3)操作(串行)隊(duì)列:dispatch_queue_create

4)GCD群組通知:dispatch_group_t

5)GCD實(shí)現(xiàn)計(jì)時(shí)器

6)后臺(tái)運(yùn)行

7)延遲執(zhí)行

四、比較多線程技術(shù)

?

?

一、Thread

我們可以使用NSTherad或NSObject類去調(diào)用:

1)顯式創(chuàng)建線程:NSThread

創(chuàng)建NSThread有兩個(gè)辦法

1.1)創(chuàng)建之后需要使用start方法,才會(huì)執(zhí)行方法:

NSThread *threadAlloc = [[NSThread alloc] initWithTarget:self selector:@selector(threadAlloc) object:nil]; [threadAlloc start];

?

1.2)創(chuàng)建并馬上執(zhí)行方法:

[NSThread detachNewThreadSelector:@selector(threadAlloc:) toTarget:self withObject:nil];

?

2)隱式創(chuàng)建線程:NSObject

我們也可以使用NSObject類的方法直接調(diào)用方法

[self performSelectorInBackground:@selector(threadAlloc) withObject:nil];

?

取消線程的方法:

實(shí)際上并沒(méi)有真正提供取消線程的API。蘋果提供了一個(gè)cancel的api,但它不能作用于取消線程,它只能改變線程的運(yùn)行狀態(tài)。我們可以使用它來(lái)進(jìn)行條件判斷。

- (void)threadCancel {NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadCancelNow) object:nil];[thread start]; }- (void)threadCancelNow {int a = 0;while (![[NSThread currentThread] isCancelled]) {NSLog(@"a - %d", a);a++;if (a == 5000) {NSLog(@"終止循環(huán)");[[NSThread currentThread] cancel];break;}} }

程序效果:循環(huán)輸出5000次,線程就會(huì)被終止。

?

NSThread線程間通訊-調(diào)用主線程修改UI:

只需要傳遞一個(gè)selector和它的參數(shù),withObject參數(shù)可以為nil,waitUntilDone代表是否要等待調(diào)用它的這個(gè)線程執(zhí)行之后再將它從主隊(duì)列調(diào)出,并在主隊(duì)列上運(yùn)行,通常設(shè)為NO,不需要等待。

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;?

?

NSThread相關(guān)屬性及方法:

// 獲取/設(shè)置線程的名字 @property (copy) NSString *name NS_AVAILABLE(10_5, 2_0);/*** 獲取當(dāng)前線程的線程對(duì)象** 通過(guò)這個(gè)屬性可以查看當(dāng)前線程是第幾條線程,主線程為1。* 可以看到當(dāng)前線程的序號(hào)及名字,主線程的序號(hào)為1,依次疊加。*/ + (NSThread *)currentThread;// 線程休眠(秒) + (void)sleepForTimeInterval:(NSTimeInterval)ti;// 線程休眠,指定具體什么時(shí)間休眠 + (void)sleepUntilDate:(NSDate *)date;// 退出線程 // 注意:這里會(huì)把線程對(duì)象銷毀!銷毀后就不能再次啟動(dòng)線程,否則程序會(huì)崩潰。 + (void)exit;

?

?

二、Cocoa?operations

1)NSInvocationOperation

創(chuàng)建NSInvocationOperation線程,附帶一個(gè)NSString參數(shù):

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationAction:) object:@"abc"]; // 需要啟動(dòng)線程,默認(rèn)是不啟動(dòng)的。 [operation start];

如在創(chuàng)建時(shí)定義了參數(shù),那么接收的時(shí)候,可以對(duì)sender進(jìn)行轉(zhuǎn)換,如字符串、數(shù)組等:

- (void)invocationAction:(NSInvocationOperation *)sender {NSLog(@"sender - %@", sender); // 輸出paramsNSString *str = (NSString *)sender;NSLog(@"str - %@e", str); // params }

附帶一提,線程的普通創(chuàng)建一般為并發(fā)執(zhí)行的,因?yàn)榇嘘?duì)列是需要顯式創(chuàng)建的,如沒(méi)看見(jiàn)此類代碼,那么即是并發(fā)隊(duì)列線程,因此,上述代碼也就是并發(fā)線程。關(guān)于并發(fā)和串行隊(duì)列(線程),我將會(huì)在下面詳細(xì)說(shuō)明,我們繼續(xù)往下看。

?

你也可以使用NSOperationQueue來(lái)創(chuàng)建一個(gè)線程隊(duì)列,用來(lái)添加子線程:

NSOperationQueue *invocationQueue = [[NSOperationQueue alloc] init];// 線程A NSInvocationOperation *invocationQ1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationAction:) object:@"invocationQ1"];// 線程B NSInvocationOperation *invocationQ2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationAction:) object:@"invocationQ2"];// 往invocationQueue添加子線程 [invocationQueue addOperations:@[invocationQ1, invocationQ2] waitUntilFinished:YES];

必須使用addOperations:方法把線程添加至隊(duì)列,不然線程不會(huì)執(zhí)行,隊(duì)列是并行執(zhí)行。或者,你也可以使用addOperation:方法添加單個(gè)線程。

?

2)NSBlockOperation

?

創(chuàng)建NSBlockOperation

// 創(chuàng)建線程任務(wù) NSBlockOperation *blockOperation = [NSBlockOperationblockOperationWithBlock:^{[NSThread sleepForTimeInterval:2];NSLog(@"one - %@", [NSThread currentThread]);}];;// 執(zhí)行線程任務(wù) [blockOperation start];

?

注意:這會(huì)在當(dāng)前的線程中執(zhí)行,因?yàn)樗歉鶕?jù)調(diào)用的線程所決定的。

?

比方說(shuō)你在主線程中運(yùn)行它,那么它就是在主線程中執(zhí)行任務(wù)。如果你是在子線程中運(yùn)行它,那么它就是在子線程中執(zhí)行任務(wù)。

?

做個(gè)簡(jiǎn)單的實(shí)驗(yàn),我們新建一條子線程,然后在子線程里調(diào)用NSBlockOperation

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSBlockOperation *blockOperation = [NSBlockOperationblockOperationWithBlock:^{[NSThread sleepForTimeInterval:2];NSLog(@"one - %@", [NSThread currentThread]);// print: one - <NSThread: 0x7f8ac2e1d0b0>{number = 2, name = (null)} }];;[blockOperation start]; });

?

它將打印:one - <NSThread: 0x7f8ac2e1d0b0>{number = 2, name = (null)},因此這個(gè)理論是正確的

?

我們也可以使它并發(fā)執(zhí)行,通過(guò)使用addExecutionBlock方法添加多個(gè)Block,這樣就能使它在主線程和其它子線程中工作。

NSBlockOperation *blockOperation = [NSBlockOperationblockOperationWithBlock:^{NSLog(@"one - %@", [NSThread currentThread]);}];;[blockOperation addExecutionBlock:^{NSLog(@"two - %@", [NSThread currentThread]); }];[blockOperation addExecutionBlock:^{NSLog(@"three - %@", [NSThread currentThread]); }];[blockOperation addExecutionBlock:^{NSLog(@"four - %@", [NSThread currentThread]); }];[blockOperation start];

?

它將打印:

two - <NSThread: 0x7fea8a70b000>{number = 3, name = (null)} one - <NSThread: 0x7fea8a558a40>{number = 4, name = (null)} four - <NSThread: 0x7fea8a406b90>{number = 1, name = main} three - <NSThread: 0x7fea8a436e40>{number = 2, name = (null)}

?

大家都看到,即使我們通過(guò)使用addExecutionBlock方法使它并發(fā)執(zhí)行任務(wù),但是它也依舊會(huì)在主線程執(zhí)行,因此我們就需要使用NSOperationQueue了。

?

3)NSOperationQueue

?

這里介紹一下NSOperation的依賴關(guān)系,依賴關(guān)系會(huì)影響線程的執(zhí)行順序:

// 創(chuàng)建操作隊(duì)列 NSOperationQueue *queue = [[NSOperationQueue alloc] init];// 線程A NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"op1");[NSThread sleepForTimeInterval:2]; }];// 線程B NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"op2"); }];// 線程C NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"op3");[NSThread sleepForTimeInterval:2]; }];// 線程B依賴線程C,也就是等線程C執(zhí)行完之后才會(huì)執(zhí)行線程B [op2 addDependency:op3]; // 線程C依賴線程A,同上,只不過(guò)依賴對(duì)象改成了線程A [op3 addDependency:op1];// 為隊(duì)列添加線程 [queue addOperation:op1]; [queue addOperation:op2]; [queue addOperation:op3];

當(dāng)你沒(méi)添加依賴時(shí),隊(duì)列是并行執(zhí)行的。

注意:依賴關(guān)系可以多重依賴,但不要建立循環(huán)依賴。

?

Cocoa?operations線程間通信-調(diào)用主線程修改UI:

// 創(chuàng)建線程對(duì)象(并發(fā)) NSBlockOperation *blockOperation = [[NSBlockOperation alloc] init];// 添加新的操作 [blockOperation addExecutionBlock:^{NSLog(@"two - %@", [NSThread currentThread]); }];// 添加新的操作 [blockOperation addExecutionBlock:^{NSLog(@"three - %@", [NSThread currentThread]);// 在主線程修改UINSOperationQueue *queue = [NSOperationQueue mainQueue];[queue addOperationWithBlock:^{[self editUINow];}]; }];[blockOperation start];

?

?NSOperation方法及屬性:

// 設(shè)置線程的最大并發(fā)數(shù) @property NSInteger maxConcurrentOperationCount;// 線程完成后調(diào)用的Block @property (copy) void (^completionBlock)(void);// 取消線程 - (void)cancel;

只列舉上面那些,其它的方法就不全列出來(lái)了。

?

注意:在NSOperationQueue類中,我們可以使用cancelAllOperations方法取消所有的線程。這里需要說(shuō)明一下,不是執(zhí)行cancelAllOperations方法時(shí)就會(huì)馬上取消,是等當(dāng)前隊(duì)列執(zhí)行完,下面的隊(duì)列不會(huì)再執(zhí)行。

?

三、Grand Central Dispatch (GCD)

1)GCD異步線程的創(chuàng)建:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSLog(@"線程 - %@", [NSThread currentThread]); });

GCD也可以創(chuàng)建同步的線程,只需要把a(bǔ)sync改成sync即可。

?

2)重復(fù)執(zhí)行線程:dispatch_apply

以下代碼會(huì)執(zhí)行4次:

dispatch_apply(4, DISPATCH_QUEUE_PRIORITY_DEFAULT, ^(size_t index) {// index則為執(zhí)行的次數(shù) 0開(kāi)始遞增NSLog(@"one - %ld", index); });

index參數(shù)為執(zhí)行的次數(shù),從0開(kāi)始遞增。

?

其中需要注意的是,每次執(zhí)行都會(huì)新開(kāi)辟一條子線程,因?yàn)槭钱惒降脑?#xff0c;它們不會(huì)是順序的。

[657:159159] one - 0, thread - <NSThread: 0x100110b50>{number = 1, name = main} [657:159191] one - 2, thread - <NSThread: 0x103800000>{number = 2, name = (null)} [657:159192] one - 3, thread - <NSThread: 0x100112b90>{number = 3, name = (null)} [657:159190] one - 1, thread - <NSThread: 0x100501180>{number = 4, name = (null)}

?

然而,GCD還有一次性執(zhí)行的方法:

dispatch_once_t once; dispatch_once(&once, ^{NSLog(@"once - %@", [NSThread currentThread]); // 主線程 });

它通常用于創(chuàng)建單例。

?

3)操作隊(duì)列:dispatch_queue_create

使用GCD也能創(chuàng)建串行隊(duì)列,具體代碼如下:

/*** GCD創(chuàng)建串行隊(duì)列** @param "com.GarveyCalvin.queue" 隊(duì)列字符串標(biāo)識(shí)* @param DISPATCH_QUEUE_CONCURRENT 可選的,可以是NULL** @return dispatch_queue_t*/ dispatch_queue_t queue = dispatch_queue_create("com.GarveyCalvin.queue", DISPATCH_QUEUE_CONCURRENT);// 線程A dispatch_async(queue, ^{[NSThread sleepForTimeInterval:1];NSLog(@"sleep async - %@", [NSThread currentThread]); });// 線程B dispatch_barrier_async(queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"sleep barrier2 - %@", [NSThread currentThread]); });// 線程C dispatch_async(queue, ^{NSLog(@"async"); });

運(yùn)行效果:以上會(huì)先執(zhí)行 線程A-》線程B-》線程C,它是一個(gè)串行隊(duì)列。

dispatch_queue_create的第二個(gè)參數(shù):

1)DISPATCH_QUEUE_SERIAL(串行)

2)DISPATCH_QUEUE_CONCURRENT(并發(fā))

?

4)GCD群組通知:dispatch_group_t

GCD的高級(jí)用法,等所有線程都完成工作后,再作通知。

// 創(chuàng)建群組 dispatch_group_t group = dispatch_group_create();// 線程A dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSLog(@"group1");[NSThread sleepForTimeInterval:2]; });// 線程B dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSLog(@"group2"); });// 待群組里的線程都完成之后調(diào)用的通知 dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSLog(@"group success"); });

群組里的線程也是并行隊(duì)列。線程A和線程B都執(zhí)行完之后,會(huì)調(diào)用通知打印group success。

?

5)GCD實(shí)現(xiàn)計(jì)時(shí)器

__block int time = 30; CGFloat reSecond = 1.0; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, reSecond * NSEC_PER_SEC, 0); dispatch_source_set_event_handler(timer, ^{time--;NSLog(@"%d", time);if (time == 0) {dispatch_source_cancel(timer);} }); dispatch_resume(timer);

代碼效果:創(chuàng)建了一個(gè)計(jì)時(shí)器,計(jì)時(shí)器運(yùn)行30秒,每過(guò)一秒會(huì)調(diào)用一次block,我們可以在block里面寫(xiě)代碼。因?yàn)閐ispatch_source_t默認(rèn)是掛起狀態(tài),因此我們使用時(shí)需要使用dispatch_resume方法先恢復(fù),不然線程不會(huì)執(zhí)行。

?

GCD線程間通信-調(diào)用主線程修改UI:

有時(shí)候我們請(qǐng)求后臺(tái)作數(shù)據(jù)處理,數(shù)據(jù)處理是異步的,數(shù)據(jù)處理完成后需要更新UI,這時(shí)候我們需要切換到主線程修改UI,例子如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSLog(@"異步數(shù)據(jù)處理 - %@", [NSThread currentThread]);[NSThread sleepForTimeInterval:2];NSLog(@"數(shù)據(jù)處理完成");// 調(diào)用主線程更新UIdispatch_async(dispatch_get_main_queue(), ^{NSLog(@"更新UI - %@", [NSThread currentThread]);[self editUINow];}); });

因?yàn)槭窃谥骶€程修改UI,所以我們最好是使用同步的GCD方法dispatch_sync。但這還不夠,我們還需要使用dispatch_get_main_queue()方法來(lái)獲得主線程,之后就是作UI的更新工作了。

?

GCD方法及屬性:

// 獲取主線程 dispatch_get_main_queue()// 創(chuàng)建隊(duì)列:第一個(gè)參數(shù)是隊(duì)列的名稱,它會(huì)出現(xiàn)在調(diào)試程序等之中,是個(gè)內(nèi)部名稱。第二個(gè)參數(shù)代表它是串行隊(duì)列還是并并發(fā)隊(duì)列,NULL代表串行隊(duì)列。 dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);// 創(chuàng)建異步調(diào)度隊(duì)列 void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);// 恢復(fù)隊(duì)列 void dispatch_resume(dispatch_object_t object);// 暫停隊(duì)列 void dispatch_suspend(dispatch_object_t object);

小結(jié):本文主要介紹了IOS三種線程對(duì)比及其使用方法。需要特別注意的是,在修改任何有關(guān)于UI的東西,我們必須要切換至主線程,在主線程里修改UI,避免不必要的麻煩產(chǎn)生。蘋果是推薦我們使用GCD,因?yàn)镚CD是這三種里面抽象級(jí)最高的,使用起來(lái)也簡(jiǎn)單,也是消耗資源最低的,并且它執(zhí)行效率比其它兩種都高。因此,能夠使用GCD的地方,盡量使用GCD。

?

6)后臺(tái)運(yùn)行

使用block的另一個(gè)好處是可以讓程序在后臺(tái)較久地運(yùn)行。在以前,當(dāng)應(yīng)用被按Home鍵退出后,應(yīng)用僅有最多5秒的時(shí)間做一些保存或清理資源的工作。?但是如果使用GCD,你可以讓你的應(yīng)用最多有10分鐘的時(shí)間在后臺(tái)長(zhǎng)久運(yùn)行。這個(gè)時(shí)間可以用來(lái)做各種事情,包括清理本地緩存、發(fā)送統(tǒng)計(jì)數(shù)據(jù)等工作。

AppDelegate.h @interface AppDelegate ()@property (assign, nonatomic) UIBackgroundTaskIdentifier backGroundUpdate;@endAppDelegate.m - (void)applicationDidEnterBackground:(UIApplication *)application {[self beginBackGroundUpdate];// 需要長(zhǎng)久運(yùn)行的代碼 [self endBackGroundUpdate]; }- (void)beginBackGroundUpdate {self.backGroundUpdate = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{[self endBackGroundUpdate];}]; }- (void)endBackGroundUpdate {[[UIApplication sharedApplication] endBackgroundTask:self.backGroundUpdate];self.backGroundUpdate = UIBackgroundTaskInvalid; }

建議大家在真機(jī)上測(cè)試,因?yàn)楣P者在模擬器測(cè)試了24分鐘還有效。

?

7)延遲執(zhí)行

如果我們想要某段代碼延遲執(zhí)行,那么可以使用dispatch_after?,但是有一個(gè)缺點(diǎn)是,當(dāng)提交代碼后(代碼執(zhí)行后),我們不能取消它,它將會(huì)運(yùn)行。另外,我們可以使用 NSTimer 進(jìn)行延時(shí)操作,值得一提,它是可以被取消的。

dispatch_time_t time_t = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(time * NSEC_PER_SEC)); dispatch_queue_t queue = dispatch_get_main_queue(); dispatch_after(time_t, queue, ^{NSLog(@"hahalo"); });

?

?

?

比較多線程技術(shù)

一、Thread:?

優(yōu)點(diǎn):量級(jí)較輕。

缺點(diǎn):需要自己管理線程的生命周期,線程同步。線程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開(kāi)銷。

二、Cocoa?operations:

優(yōu)點(diǎn):不需要關(guān)心線程管理,數(shù)據(jù)同步的事情,可以把精力放在自己需要執(zhí)行的操作上。

三、Grand Central Dispatch (GCD):

優(yōu)點(diǎn):GCD基于C的API,非常底層,可以充分利用多核,能夠輕松在多核系統(tǒng)上高效運(yùn)行并發(fā)代碼,也是蘋果推薦使用的多線程技術(shù)。

?

?

?

本文參考:

iOS多線程開(kāi)發(fā)

GCD的另一個(gè)用處是可以讓程序在后臺(tái)較長(zhǎng)久的運(yùn)行。

全面掌握iOS多線程攻略?—— PS:這個(gè)攻略較多,但是有很多重復(fù)的內(nèi)容。

iOS多線程的初步研究(一)-- NSThread

?

?


博文作者:GarveyCalvin

博文出處:http://www.cnblogs.com/GarveyCalvin/

本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但須保留此段聲明,并給出原文鏈接,謝謝合作!

?

轉(zhuǎn)載于:https://www.cnblogs.com/GarveyCalvin/p/4206009.html

總結(jié)

以上是生活随笔為你收集整理的iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。