iOS開發(fā)多線程篇-NSThread

上篇我們學(xué)習(xí)了iOS多線程解決方式中的NSOperation妹笆,這篇我主要概況總結(jié)iOS多線程中NSThread的解決方式和基本用例

一.iOS多線程對(duì)比

  1. NSThread
    每個(gè)NSThread對(duì)象對(duì)應(yīng)一個(gè)線程汉嗽,真正最原始的線程
  • 優(yōu)點(diǎn):NSThread輕量級(jí)最輕藐翎,相對(duì)簡(jiǎn)單
  • 缺點(diǎn):手動(dòng)管理所有的線程活動(dòng),如生命周期寝优、線程同步、睡眠等
  1. NSOperation
    自帶線程管理的抽象類
  • 優(yōu)點(diǎn):自帶線程周期管理,操作上可更注重自己邏輯
  • 缺點(diǎn):面向?qū)ο蟮某橄箢惼墙。荒軐?shí)現(xiàn)它或者使用它定義好的兩個(gè)子類:NSInvocationOperationNSBlockOperation
  1. GCD
    Grand Central Dispatch 是Apple開發(fā)的一個(gè)多核編程的解決方法。
  • 優(yōu)點(diǎn):最高效插勤,避開并發(fā)陷阱
  • 缺點(diǎn):基于C實(shí)現(xiàn)
  1. 選擇小結(jié)
    • 簡(jiǎn)單而安全的選擇NSOperation實(shí)現(xiàn)多線程即可
    • 處理大量并發(fā)數(shù)據(jù)沽瘦,又追求性能效率的選擇GCD
    • NSThread較麻煩,不建議使用

二. 場(chǎng)景選擇

  1. 圖片異步加載:這種常見的場(chǎng)景是最常見也是必不可少的农尖,異步加載圖片又分成兩種
  • 在UI主線程開啟新線程按順序加載圖片析恋,加載完成刷新UI
  • 依然是在主線程開啟新線程,順序不定的加載圖片盛卡,加載完成后刷新UI
  1. 創(chuàng)作工具上的異步:這個(gè)跟上邊任務(wù)調(diào)度道理差不多助隧,只是為了豐富描述,有助于“舉一反三”效果滑沧,如下描述的是APP創(chuàng)作小說
  • app本地創(chuàng)作10個(gè)章節(jié)內(nèi)容完成同步服務(wù)器并村,接著同時(shí)發(fā)表這10個(gè)章節(jié)將產(chǎn)生的一系列動(dòng)作,其中上傳內(nèi)容嚎货,獲取分配章節(jié)Id橘霎,如果后臺(tái)沒有做處理最好方式做異步按順序執(zhí)行。
  • app本地創(chuàng)作列表中有3本小說要發(fā)表殖属,如果同時(shí)發(fā)表創(chuàng)作列表中的3本小說姐叁,自然考慮并行隊(duì)列執(zhí)行發(fā)表。

三.使用方法

  1. 三種實(shí)現(xiàn)開啟線程方式:
  • 動(dòng)態(tài)實(shí)例化
    NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImageSource:) object:imgUrl];
    thread.threadPriority = 1;  //設(shè)置線程的優(yōu)先級(jí)(0.0 - 1.0, 1.0最高級(jí))
    [thread start];
  • 靜態(tài)實(shí)例化
    
    [NSThread detachNewThreadSelector:@selector(loadImageSource:) toTarget:self withObject:imgUrl];
  • 隱式實(shí)例化
    [self performSelectorOnMainThread:@selector(loadImageSource:) withObject:self waitUntilDone:imgUrl];

代碼示例:

//
//  ViewController.m
//  TestNSThread
//
//  Created by taobaichi on 2017/3/21.
//  Copyright ? 2017年 MaChao. All rights reserved.
//

#import "ViewController.h"
#define imgUrl @"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"

@interface ViewController ()

@property (nonatomic, strong) UIImageView * imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(self.view.frame.size.width /2 - 100, self.view.frame.size.height / 2 - 100, 200, 200)];
    self.imageView.backgroundColor = [UIColor purpleColor];
    [self.view addSubview:self.imageView];
    
    [self dynamicCreateThread];
}

//動(dòng)態(tài)創(chuàng)建線程
-(void)dynamicCreateThread{
    NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImageSource:) object:imgUrl];
    thread.threadPriority = 1;  //設(shè)置線程的優(yōu)先級(jí)(0.0 - 1.0 1.0最高級(jí))
    [thread start];
}

//靜態(tài)創(chuàng)建線程
-(void)staticCreateThread{
    [NSThread detachNewThreadSelector:@selector(loadImageSource:) toTarget:self withObject:imgUrl];
}

//隱式創(chuàng)建線程
-(void)implicitCreateThread{
    [self performSelectorInBackground:@selector(loadImageSource:) withObject:imgUrl];
}

-(void)loadImageSource:(NSString *)url
{
    NSData * imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
    UIImage * image = [UIImage imageWithData:imgData];
    
    if (imgData != nil) {
        //回到主線程刷新UI
        [self performSelectorOnMainThread:@selector(refreshImageView:) withObject:image waitUntilDone:YES];
    }else{
        NSLog(@"there no image data");
    }
}

-(void)refreshImageView:(UIImage *)image{
    
    [self.imageView setImage:image];
}

@end

2.NSThread的拓展認(rèn)識(shí)

  • 獲取當(dāng)前線程
NSThread * current = [NSThread currentThread];
  • 獲取主線程
NSThread * main = [NSThread mainThread];
  • 暫停當(dāng)前線程
[NSThread sleepForTimeInterval:2.0];
  • 線程之間通信
    //在指定線程上執(zhí)行
    [self performSelector:@selector(refreshImageView:) onThread:thread withObject:image waitUntilDone:YES];
    
    //在主線程執(zhí)行
    [self performSelectorOnMainThread:@selector(refreshImageView:) withObject:image waitUntilDone:YES];

    //在后臺(tái)執(zhí)行
    [self performSelectorInBackground:@selector(refreshImageView:) withObject:image];
    
    //在當(dāng)前 線程上執(zhí)行
    [self performSelector:@selector(refreshImageView:) withObject:image];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末外潜,一起剝皮案震驚了整個(gè)濱河市原环,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌处窥,老刑警劉巖嘱吗,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異滔驾,居然都是意外死亡谒麦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門哆致,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绕德,“玉大人,你說我怎么就攤上這事摊阀〕苌撸” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵胞此,是天一觀的道長(zhǎng)臣咖。 經(jīng)常有香客問我,道長(zhǎng)漱牵,這世上最難降的妖魔是什么夺蛇? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮布疙,結(jié)果婚禮上蚊惯,老公的妹妹穿的比我還像新娘。我一直安慰自己灵临,他們只是感情好截型,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著儒溉,像睡著了一般宦焦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顿涣,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天波闹,我揣著相機(jī)與錄音,去河邊找鬼涛碑。 笑死精堕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蒲障。 我是一名探鬼主播歹篓,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼瘫证,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了庄撮?” 一聲冷哼從身側(cè)響起背捌,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洞斯,沒想到半個(gè)月后毡庆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烙如,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年么抗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厅翔。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乖坠,死狀恐怖搀突,靈堂內(nèi)的尸體忽然破棺而出刀闷,到底是詐尸還是另有隱情,我是刑警寧澤仰迁,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布甸昏,位于F島的核電站,受9級(jí)特大地震影響徐许,放射性物質(zhì)發(fā)生泄漏施蜜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一雌隅、第九天 我趴在偏房一處隱蔽的房頂上張望翻默。 院中可真熱鬧,春花似錦恰起、人聲如沸修械。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肯污。三九已至,卻和暖如春吨枉,著一層夾襖步出監(jiān)牢的瞬間蹦渣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工貌亭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柬唯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓圃庭,卻偏偏與公主長(zhǎng)得像锄奢,于是被迫代替她去往敵國(guó)和親美尸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容