亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS開發之多線程技術(NSThread、OperationQueue、GCD)

2019-11-14 19:53:20
字體:
來源:轉載
供稿:網友

  在前面的博客中如果用到了異步請求的話,也是用到的第三方的東西,沒有正兒八經的用過iOS中多線程的東西。其實多線程的東西還是蠻重要的,如果對于之前學過操作系統的小伙伴來說,理解多線程的東西還是比較容易的,今天就做一個小的demo來詳細的了解一下iOS中的多線程的東西??赡芟旅娴臇|西會比較枯燥,但還是比較實用的。

  多線程用的還是比較多的,廢話少說了,下面的兩張截圖是今天我們實驗的最終結果,應該是比較全的,小伙伴們由圖來分析具體的功能吧:

  功能說明:

    1、點擊同步請求圖片,觀察整個UI界面的變化,并點擊測試按鈕,紅色是否會變成綠色?! ?/p>

    2、NSThread按鈕,是由NSThread方式創建線程并執行相應的操作。

    3、Block操作按鈕是用Block創建操作,并在操作隊列中執行,下面的是Invocation操作

    4、serial是GCD中的串行隊列,concurrent是GCD中的并行隊列

  好啦,上面的咸蛋先到這兒,代碼該走起啦。

  一、準備階段

     1.不管使用代碼寫,還是storyboard或者xib等,先把上面所需的控件初始化好以便使用

     2.點擊測試UI按鈕,改變下邊label的顏色的代碼如下:

 1 //改變lable的顏色,在紅綠顏色之間進行交換 2 - (IBAction)tapTestButton:(id)sender { 3     static int i = 1; 4     if (i == 1) { 5         _testLabel.backgroundColor = [UIColor redColor]; 6         i = 0; 7     } 8     else 9     {10         _testLabel.backgroundColor = [UIColor greenColor];11         i = 1;12     }13     14 }

 

    3.從網絡上獲取圖片,并使用主線程顯示進程調用情況

 1 //從wang'lu獲取圖片數據 2 -(NSData *) getImageData 3 { 4      5     _count ++; 6     int count = _count;
    //線程開始啟動
7   NSString *str = [NSString stringWithFormat:@"%d.線程%@",count,[NSThread currentThread]];
    NSLog(@"%@",str);
 8     NSData *data; 9     [NSThread sleepForTimeInterval:0.5];10     data = [NSData dataWithContentsOfURL:[NSURL URLWithString:IMAGEURL]];11 12     NSString *str = [NSString stringWithFormat:@"%d.線程%@完畢",count,[NSThread currentThread]];13     //請求數據的任務由其他線程解決,所以LogTextView的內容由主線程更新,也只有主線程才能更新UI14     [self performSelectorOnMainThread:@selector(updateTextViewWithString:) withObject:str waitUntilDone:YES];15     return data;16 }

 

    4.上面的用到了主線程來調用updateTextViewWithString方法,因為只有主線程才能更新UI,updateTextViewWithString:這個方法負責把線程的執行信息顯示在View上,代碼如下:

1 //在ViewController上顯示圖片請求情況2 -(void)updateTextViewWithString:(NSString *)str3 {4     NSString *old_str = [NSString stringWithFormat:@"%@/n%@",_logTextView.text, str];5     6     _logTextView.text = old_str;7     //改變Label的顏色,便于觀察8     [self tapTestButton:nil];9 }

 

    5.把請求完的圖片加載到ImageView上

1 //更新圖片2 -(void) updateImageWithData:(NSData *)data3 {4     UIImage *image = [UIImage imageWithData:data];5     [_testImage setImage:image];6 }

 

    6.加載圖片的,也就是請求數據后在ImageView上顯示

1 //由其他線程請求數據,由主線程來更新UI2 -(void)loadImageWithThreadName:(NSString *)threadName3 {4     [[NSThread currentThread] setName:threadName];5     6     NSData *data = [self getImageData];7     [self performSelectorOnMainThread:@selector(updateImageWithData:) withObject:data waitUntilDone:YES];8 }

 

  二、通過各種方式來

    1.同步請求圖片測試,請求數據和更新UI都放在主線程中順序執行,這樣在請求數據的時候UI會卡死,代碼如下;

1 //同步請求圖片,視圖阻塞的,因為主線程被占用,無法進行視圖的更新2 - (IBAction)tapButton:(id)sender {3     NSData *data = [self getImageData];4     [self updateImageWithData:data];5 }

 

    2.NSThread創建線程測試,用detachNewThreadSelector方法來創建新的線程會自動啟動并執行,而不用調用start方法。代碼如下:

1 //NSThread2 - (IBAction)tapButton2:(id)sender {3     //點擊一次button就創建一個新的線程來請求圖片數據4     for (int i = 0;i < 10; i ++) {5         [NSThread detachNewThreadSelector:@selector(loadImageWithThreadName:) toTarget:self withObject:@"NSThread"];6     }7  }

 

   

    3.NSInvocationOperation的使用,新建一個調用操作,然后添加到隊列中執行,代碼如下:

 1 //NSInvocationOperation 2 - (IBAction)tapInvocationOperation:(id)sender { 3   4      5     //上面的調用操作需要放到調用隊列里才執行的 6     //創建操作隊列 7     NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 8  9     for (int i = 0;i < 10; i ++) {10         //實例化一個調用操作,來執行數據請求11         NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImageWithThreadName:) object:@"Invocation"];12         //把上面的調用操作放到操作隊列里,隊列會自動開啟一個線程調用我們指定的方法13         [operationQueue addOperation:invocationOperation];14     }15 }

 

 

    4.block的操作,新建一個block操作,并添加到隊列中執行,代碼如下:

 1 //BlockOperation 2 - (IBAction)tapBlockOperation:(id)sender { 3     __weak __block ViewController *copy_self = self; 4      5     //創建BlockOperation 6     NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{ 7         [copy_self loadImageWithThreadName:@"Block"]; 8     }]; 9     10     //添加到操作隊列11     NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];12     [operationQueue addOperation:blockOperation];13     14     for (int i = 0;i < 10; i ++) {15     16         //另一種方式17         [operationQueue addOperationWithBlock:^{18             [copy_self loadImageWithThreadName:@"Block"];19         }];20     }21 }

 

 

    5.GCD中的串行隊列:

 1 //串行隊列 2 - (IBAction)tapGCDserialQueue:(id)sender { 3     //創建串行隊列 4     dispatch_queue_t serialQueue = dispatch_queue_create("mySerialQueue", DISPATCH_QUEUE_SERIAL); 5      6      7     __weak __block ViewController *copy_self = self; 8      9     10     for (int i = 0;i < 10; i ++) {11         //異步執行隊列12         dispatch_async(serialQueue, ^{13             [copy_self loadImageWithThreadName:@"Serial"];14         });15     }16     17     18 }

 

 

    6.GCD中的并行隊列:

 1 //并行隊列 2 - (IBAction)tapGCDConcurrentQueue:(id)sender { 3     //創建并行隊列 4     dispatch_queue_t concurrentQueue = dispatch_queue_create("myConcurrentQueue", DISPATCH_QUEUE_CONCURRENT); 5     __weak __block ViewController *copy_self = self; 6      7     for (int i = 0;i < 10; i ++) { 8         //異步執行隊列 9         dispatch_async(concurrentQueue, ^{10             [copy_self loadImageWithThreadName:@"Concurrent"];11         });12 13     }14     15 }

 

    以上是各個按鈕對應的方法,下面的截圖是執行結果:

 

  三、線程間的同步問題(為我們的線程添加上同步鎖)

    在操作系統中講多線程時有一個名詞叫臟數據,就是多個線程操作同一塊資源造成的,下面就修改一下代碼,讓數據出現問題,然后用同步鎖來解決這個問題

    1.在getImageData方法(標題一中的第3個方法)中有兩條語句。這個用來顯示線程的標號。上面的標號是沒有重復的。

1     _count ++;2     int count = _count;

    在兩條語句中間加一個延遲,如下:

    _count ++;    [NSThread sleepForTimeInterval:1];    int count = _count;

    如果運行的話,會有好多標號是重復的,如圖一,__count是成員變量,多個線程對此他進行操作,所以會出現標號不一致的情況,下面我們加上同步鎖

    ?。?)用NSLock加同步鎖,代碼如下:

1     //通過NSLock加鎖2     [_lock lock];3     _count ++;4     [NSThread sleepForTimeInterval:1];5     int count = _count;6     [_lock unlock];

   ?。?)通過@synchronized加同步鎖,代碼如下:

1     //通過synchronized加鎖2     int count;3     @synchronized(self){4         _count ++;5         [NSThread sleepForTimeInterval:1];6          count = _count;7     }

      加鎖前后的運行效果如下:

  GCD的串行隊列開始執行的順序如下,下面是是在一個線程中按FIFO的順序執行的:

  GCD中的并行隊列,是在不同的線程中同時執行的:

 

  今天博客中的內容還是蠻多的,如果之前接觸過java的多線程的東西,或者其他語言中的多線程的話,理解起來應該問題不大。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
人人做人人澡人人爽欧美| 日韩中文在线中文网三级| 亚洲国产女人aaa毛片在线| 欧美日韩国产综合新一区| 欧美日韩国产一区二区| 亚洲香蕉成人av网站在线观看| 久久精品99久久久香蕉| 日韩精品高清视频| 26uuu亚洲伊人春色| 成人免费xxxxx在线观看| 国产欧美精品xxxx另类| 91免费国产视频| 日韩免费在线免费观看| 亚洲国产成人久久| 亚洲人成电影网站色…| 92版电视剧仙鹤神针在线观看| 91av成人在线| 久久久久五月天| 亚洲精品98久久久久久中文字幕| 日本乱人伦a精品| 欧美午夜无遮挡| 亚洲丝袜一区在线| 亚洲图片在线综合| 欧美最近摘花xxxx摘花| 青青草原成人在线视频| 国产精品久久久久秋霞鲁丝| 国产美女直播视频一区| 国产精品毛片a∨一区二区三区|国| 久久人91精品久久久久久不卡| 2020欧美日韩在线视频| 成人欧美一区二区三区在线| 国产精品视频永久免费播放| 精品高清美女精品国产区| 亚洲18私人小影院| 亚洲精品福利免费在线观看| 一区二区三区 在线观看视| 国产激情999| 亚洲成人久久电影| 4k岛国日韩精品**专区| 亚洲精品视频播放| 久久影院免费观看| 久久久久久久一区二区三区| 欧美性生活大片免费观看网址| 青青久久av北条麻妃黑人| 国产精品va在线播放我和闺蜜| 国产精品美女久久久久久免费| 久久精品视频在线播放| 91av在线影院| 日韩av影视在线| 日韩高清欧美高清| 日韩在线激情视频| 日韩美女主播视频| 国产午夜精品全部视频播放| 亚洲精品之草原avav久久| 亚洲wwwav| 亚洲精品美女在线观看播放| 亚洲www在线| 色妞欧美日韩在线| 日韩av在线天堂网| 亚洲最大av在线| 国产精品极品尤物在线观看| 国产suv精品一区二区| 精品久久久久久中文字幕大豆网| 久久久av免费| 中文字幕无线精品亚洲乱码一区| 欧美美女操人视频| 国产精品羞羞答答| 亚洲人成网在线播放| 亚洲精品视频网上网址在线观看| 日韩av电影手机在线| 中文字幕欧美精品日韩中文字幕| 91av网站在线播放| 国产精品久久久久久网站| 一区二区三区国产视频| 亚洲免费视频网站| 九九九久久久久久| 国产成人精品av| 亚洲国产欧美一区二区三区同亚洲| 91欧美激情另类亚洲| 亚洲精品成人网| 亚洲第一区第二区| 国产精品一区二区三区久久久| 国产精品久久97| 欧美激情日韩图片| 久久青草福利网站| 欧美中文字幕在线观看| 亚洲激情自拍图| 成人xvideos免费视频| 久久久久久这里只有精品| 国产成人短视频| 精品国产91久久久久久老师| 欧美亚州一区二区三区| 亚洲精品中文字幕av| 精品女同一区二区三区在线播放| 7777免费精品视频| 亚洲黄色在线看| 国产91精品网站| 欧美日韩亚洲一区二| 日韩免费高清在线观看| 精品欧美国产一区二区三区| 国产欧美久久一区二区| 日韩在线观看免费全集电视剧网站| 国产精品久久久久不卡| 国产成人涩涩涩视频在线观看| 久久艹在线视频| 国产精品一久久香蕉国产线看观看| 亚洲最大成人在线| 欧美久久精品一级黑人c片| 一本色道久久综合亚洲精品小说| 97久久久免费福利网址| 高清日韩电视剧大全免费播放在线观看| 久精品免费视频| 国产精品久久久亚洲| 91精品国产色综合久久不卡98口| 亚洲aⅴ日韩av电影在线观看| 日韩欧美一区视频| 日韩hd视频在线观看| 久久天天躁日日躁| 精品久久久久久久久久久久久| 久久人91精品久久久久久不卡| 日本不卡视频在线播放| 久久久久久久久中文字幕| 欧美成人剧情片在线观看| 亚洲亚裔videos黑人hd| 亚州av一区二区| 久久999免费视频| 97视频在线免费观看| 欧美视频免费在线| 精品国产一区久久久| 国产精品久久久久秋霞鲁丝| 精品国产电影一区| 久久久久久久国产精品视频| 日韩网站免费观看高清| 91精品在线一区| 亚洲国语精品自产拍在线观看| 精品视频9999| 午夜精品久久久久久99热软件| 欧美成人第一页| 成人黄色短视频在线观看| 国产噜噜噜噜噜久久久久久久久| 97国产成人精品视频| 97精品在线观看| 久久久久久午夜| 91黑丝高跟在线| 国产成人拍精品视频午夜网站| 91久久久久久久| 91久久精品日日躁夜夜躁国产| 亚洲久久久久久久久久| 精品国内自产拍在线观看| 欧美性极品少妇精品网站| 亚州成人av在线| 日本欧美黄网站| 精品人伦一区二区三区蜜桃免费| 国产精品色视频| 久久国产精品免费视频| 国产成人精品一区二区| 久久国产精品久久久久久久久久| 在线精品视频视频中文字幕| 97精品欧美一区二区三区| 欧美午夜激情在线| 九九精品视频在线| 日韩精品视频中文在线观看| 国外视频精品毛片| 亚洲成av人影院在线观看|