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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS进阶之多线程

發布時間:2024/10/12 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS进阶之多线程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

多線程

注意:iOS關于UI的刷新和添加必須在主線程中操作!

pthread的創建方法:

pthread_t pthread;//第一個參數 線程指針//第二個參數 線程的一些屬性//第三個參數 函數指針 用于執行方法//第四個參數 線程中的傳值pthread_create(&pthread, NULL, run, NULL);

當應用程序剛運行的時候, 系統會自動為我們開放一個線程,該線程為主線程.

子線程是程序員用代碼手動開啟的線程,它存在的意義是為了執行耗時操作的任務.

一、NSThread的創建方法:

1.

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(haoshicaozuo) object:@"123"];thread.name = @"123";//開啟線程[thread start];

2.快捷創建

[NSThread detachNewThreadSelector:@selector(haoshicaozuo) toTarget:self withObject:@"456"]; [self performSelectorInBackground:@selector(haoshicaozuo) withObject:@"123"];

下面一行代碼指的是睡眠時間, 根據特定需求修改時長.

[NSThread sleepForTimeInterval:0.5];

二、NSOperation

NSOperation是一個抽象類,我們一般不直接使用它,而是使用它的子類NSInvocationOperation和NSBlockOperation,如果他們單獨使用都是在主線程執行,只有和隊列放在一起使用時在子線程執行.

NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction1) object:nil]; // [operation1 start];NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction2) object:nil];NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{for (int i = 20; i < 30; i++) {NSLog(@"%d", i);}}];//加入到隊列//mainQueue代表著主隊列 // NSOperationQueue *queue = [NSOperationQueue mainQueue];//如果是alloc init 那就代表著其他對列//先加的先執行,后加的后執行, 但是執行的時間不一定, 可能后執行的比先執行的先執行完NSOperationQueue *queue = [[NSOperationQueue alloc] init];[queue addOperation:operation1];[queue addOperation:operation2];[queue addOperation:operation3];

三、GCD

異步: 不在一個線程執行

同步: 在同一個線程執行?

串行: 串在一起執行

并行: 一起執行

?

同步 + 主隊列 ? :所有通過GCD提交到主隊列的任務必須是異步的, 否則會造成死鎖

異步 + 主隊列 : 不開辟線程, 就在主線程執行?(主隊列就是串行的)

同步 + 串行對列: 不具備開啟線程的能力, 在當前線程完成任務

異步 + 串行 ? ? ?:具備開啟線程的能力, 但是任務是串行的,執行完一個才會去執行下一個

同步 + 并行隊列 : 不具備開啟線程的能力,并發的功能也就沒用了

  并行隊列的兩種創建方式:

dispatch_queue_t queue = dispatch_queue_create("sb.2b.com", DISPATCH_QUEUE_CONCURRENT); dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

異步 + 并發隊列

三(一):GCD網絡請求:

?

- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib. dispatch_queue_t queue = dispatch_queue_create("aaa", DISPATCH_QUEUE_CONCURRENT);dispatch_async(queue, ^{NSURL *url = [NSURL URLWithString:@"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1464140268&di=6b6b2e3ea5da34b7da1e02fd28c7acd2&src=http://pic36.nipic.com/20131115/12106414_153522431000_2.jpg"];NSData *data = [NSData dataWithContentsOfURL:url];dispatch_sync(dispatch_get_main_queue(), ^{self.myImageView.image = [UIImage imageWithData:data];});});}

?

三(二):GCD函數的使用:

延遲執行block

?

void dispatch_after(dispatch_time_t?when,?dispatch_queue_t?queue,?dispatch_block_t?block);?

重復執行block,需要注意的是這個方法是同步返回,也就是說等到所有block執行完畢才返回,如需異步返回則嵌套在dispatch_async中來使用。多個block的運行是否并發或串行執行也依賴queue的是否并發或串行。

void?dispatch_apply(size_t?iterations,?dispatch_queue_t?queue,?void?(^block)(size_t));?

?

轉載于:https://www.cnblogs.com/dayihao/p/5634513.html

總結

以上是生活随笔為你收集整理的iOS进阶之多线程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。