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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

iOS线程开发小结

發(fā)布時間:2023/12/29 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS线程开发小结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在iOS開發(fā)線程操作時,一般方法名決定是否開啟新線程(async,sync),隊(duì)列類型(全局隊(duì)列,串行隊(duì)列)決定開啟多少條線程

?

?1.快速線程調(diào)用

?*開啟后臺線程執(zhí)行任務(wù)

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

?

?*回到主線程執(zhí)行任務(wù)

?[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

?

?2.GCD : 依賴隊(duì)列執(zhí)行

?1> 隊(duì)列類型

?* 全局隊(duì)列

?* 所有添加到全局隊(duì)列中的任務(wù)都是并發(fā)執(zhí)行(同時執(zhí)行,可能會開啟多個線程)

?* dispatch_get_global_queue

?

?* 串行隊(duì)列

?* 所有添加到串行隊(duì)列中的任務(wù)都是按順序執(zhí)行(開一條線程)

?* dispatch_queue_create("myqueue", 0);

?

?* 主隊(duì)列

?* 所有添加到主隊(duì)列中的任務(wù)都是在主線程中執(zhí)行的(跟方法名沒有關(guān)系)

?* dispatch_get_main_queue

?

?2> 同步還是異步,取決于方法名(不影響主隊(duì)列,影響全局隊(duì)列、串行隊(duì)列)

?* 同步:dispatch_sync,在當(dāng)前線程執(zhí)行任務(wù),不會開啟新的線程

?* 異步:dispatch_async,在其他線程執(zhí)行任務(wù),會開啟新的線程

?

?3.NSOperation\NSOperationQueue

?1> 使用步驟

?* 創(chuàng)建NSOperation

?* 添加NSOperation到NSOperationQueue

?

?2> 優(yōu)點(diǎn)

?* 更加面向?qū)ο?/p>

?* 可以控制最大并發(fā)數(shù)? maxConcurrentOperationCount

?* 添加任務(wù)(Operation)之間的依賴 addDependency

?*/

#import "XMQViewController.h"

?

@interface XMQViewController ()

{

? ? NSOperationQueue *_queue;

}

@end

?

@implementation XMQViewController

?

- (void)viewDidLoad

{

? ? [super viewDidLoad];

?? ?

? ? _queue = [[NSOperationQueue alloc] init];

? ? // 控制最大并發(fā)數(shù),最多同時執(zhí)行3條線程

? ? _queue.maxConcurrentOperationCount = 3;

?? ?

? ? // 回到主線程

//? ? [self test];

?? ?

? ? // 線程監(jiān)聽

//? ? [self gcd_group];

?? ?

? ? // GCD線程依賴

//? ? [self gcd_barrier];

?? ?

? ? // 循環(huán)執(zhí)行

? ? [self gcd_apply];

?

? ? // 全局隊(duì)列

? ? dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

? ? // 串行隊(duì)列

//? ? dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);

?? ?

? ? dispatch_async(queue, ^{ // 耗時操作

? ? ? ? NSLog(@"這是一個異步線程---%@", [NSThread currentThread]);

? ? });

}

?

- (IBAction)click

{

? ? NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

? ? ? ? NSLog(@"operation---%@", [NSThread currentThread]);

? ? }];

?? ?

? ? NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{

? ? ? ? NSLog(@"operation2---%@", [NSThread currentThread]);

? ? }];

?? ?

? ? // 該方法默認(rèn)在主線程執(zhí)行

//? ? [operation start];

?? ?

? ? // 加入隊(duì)列會在異步線程執(zhí)行

? ? [_queue addOperation:operation];

? ? [_queue addOperation:operation2];

?? ?

? ? // 設(shè)置線程依賴 (operation2依賴于operation,operation執(zhí)行完以后,才能執(zhí)行operation2)

? ? [operation addDependency:operation2];

}

?

// 延時執(zhí)行某條線程

- (IBAction)click2

{

? ? // 全局隊(duì)列

//? ? dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

? ? // 串行隊(duì)列

? ? dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);

? ? double delayInSeconds = 5.0;

? ? dispatch_time_t delayInNanoSeconds =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

? ? dispatch_after(delayInNanoSeconds, queue2, ^{

? ? ? ? NSLog(@"延遲執(zhí)行");

? ? });

}

?

// dispatch_group_async(異步方法)可以實(shí)現(xiàn)監(jiān)聽一組任務(wù)是否完成,完成后得到通知執(zhí)行其他的操作(比如通知用戶下載完成,顯示UI等)

- (void)gcd_group

{

? ? 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_barrier_async 是在前面的任務(wù)執(zhí)行結(jié)束后才執(zhí)行,而且后面的任務(wù)必須等它執(zhí)行完成之后才會執(zhí)行

- (void)gcd_barrier

{

? ? dispatch_queue_t queue = dispatch_queue_create("myqueue", 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:2];

? ? ? ? NSLog(@"dispatch_async3");

? ? });

}

?

// dispatch_apply 執(zhí)行某個代碼片段N次

- (void)gcd_apply

{

? ? dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_PRIORITY_DEFAULT);

? ? dispatch_apply(10, queue, ^(size_t index) {

? ? ? ? NSLog(@"循環(huán)執(zhí)行10次");

? ? });

}

?

// 回到主線程

- (void)test

{

? ? UIImage *image = nil;

? ? [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];?

? ? dispatch_async(dispatch_get_main_queue(), ^{

? ? ? ? NSLog(@"更新UI界面---%@", [NSThread currentThread]);

? ? });

}

@end

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

總結(jié)

以上是生活随笔為你收集整理的iOS线程开发小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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