iOS 線程間通訊

在我們做的項(xiàng)目中盔沫,這些線程間的通訊多用于圖片的下載钠四,而這些常常SDWebImage或者YYWebImage 都會(huì)給我們做好踱阿,所以我寫(xiě)的并無(wú)卵用透罢,

  • 下面來(lái)總結(jié)一下線程間通信的幾種方法 :
  • NSThread
  • GCD
  • NSOperation
  • NSthread:
    優(yōu)點(diǎn):比其他兩種輕量級(jí)。
    缺點(diǎn):需要自己管理線程的生命周期,線程同步廓啊。 線程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的開(kāi)銷(xiāo)欢搜。
  • Operation、GCD:

    優(yōu)點(diǎn):不需要關(guān)心線程管理谴轮,數(shù)據(jù)同步的事情炒瘟。

    兩者區(qū)別:NSOperationQueue可以方便的管理并發(fā)、 NSOperation之間的優(yōu)先級(jí)第步。GCD主要與block結(jié)合使用疮装。代碼簡(jiǎn)潔高效

  1. 性能:GCD更接近底層,而NSOperationQueue則更高級(jí)抽象雌续,所以GCD在追求性能的底層操作來(lái)說(shuō)斩个,是速度最快的。這取決于使用Instruments進(jìn)行代碼性能分析驯杜,如有必要的話
  1. 從異步操作之間的事務(wù)性,順序行做个,依賴關(guān)系鸽心。GCD需要自己寫(xiě)更多的代碼來(lái)實(shí)現(xiàn),而NSOperationQueue已經(jīng)內(nèi)建了這些支持
  1. 如果異步操作的過(guò)程需要更多的被交互和UI呈現(xiàn)出來(lái)居暖,NSOperationQueue會(huì)是一個(gè)更好的選擇顽频。底層代碼中,任務(wù)之間不太互相依賴太闺,而需要更高的并發(fā)能力糯景,GCD則更有優(yōu)勢(shì)

<h3>☆分別用這三個(gè)方法創(chuàng)建一個(gè)下載圖片的案例

NSThread

- (void)thread{
    //1.去網(wǎng)絡(luò)上加載數(shù)據(jù)
    NSString *imageURLString = @"http://imgsrc.baidu.com/forum/w%3D580/sign=13eeace7d058ccbf1bbcb53229d9bcd4/9245d688d43f879404f24d7bd31b0ef41bd53a51.jpg";
    [self performSelectorInBackground:@selector(loadImage:) withObject:imageURLString];//
}


- (void)loadImage:(NSString *)imageURLString{
    NSLog(@"loadImage--- %@",[NSThread currentThread]);
    
    //1.拿著imageURLString去網(wǎng)絡(luò)上下載
    NSURL *url = [NSURL URLWithString:imageURLString];
    
    //2.去網(wǎng)絡(luò)上加載圖片
    NSData *imageData = [NSData dataWithContentsOfURL:url];
    
    //3.將我們從網(wǎng)絡(luò)上獲取到的圖片的二進(jìn)制,轉(zhuǎn)成UIImage
    UIImage *image = [UIImage imageWithData:imageData];
    
    //4.回到主線程,并且將image傳給主線程,讓主線程去更新UI
    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];//YES同步,NO 異步
    
    NSLog(@"---子線程over---");
}

- (void)updateUI:(UIImage *)image{
    NSLog(@"updateUI---%@",[NSThread currentThread]);
    
    self.imageView.image = image;
}

GCD

- (void)gcd{
    
    NSString *imageURLString = @"http://imgsrc.baidu.com/forum/w%3D580/sign=13eeace7d058ccbf1bbcb53229d9bcd4/9245d688d43f879404f24d7bd31b0ef41bd53a51.jpg";
    
    //1.去子線程,下載圖片,這是一個(gè)耗時(shí)間的操作
    
    __weak typeof(self) weakSelf = self;
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"gcd---loadImage===%@",[NSThread currentThread]);
        
        //1.1.拿著imageURLString去網(wǎng)絡(luò)上下載
        NSURL *url = [NSURL URLWithString:imageURLString];
        
        //1.2.去網(wǎng)絡(luò)上加載圖片
        NSData *imageData = [NSData dataWithContentsOfURL:url];
        
        //1.3.將我們從網(wǎng)絡(luò)上獲取到的圖片的二進(jìn)制,轉(zhuǎn)成UIImage
        UIImage *image = [UIImage imageWithData:imageData];
        
        //2.回到主線程更新UI
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"updateUI---%@",[NSThread currentThread]);
            weakSelf.imageView.image = image;
        });
    });
    
    
    //2.回到主線程更新UI
}

☆NSOperation (SDWebImage或者YYWebImage)都是這樣實(shí)現(xiàn)的

NSOperation 有兩個(gè)子類(lèi)(不好使),但通常是用第三種方法實(shí)現(xiàn)
1> NSInvocationOperation
2> NSBlockOperation
3> 自定義子類(lèi)繼承NSOperation省骂,實(shí)現(xiàn)內(nèi)部相應(yīng)的方法

  • 創(chuàng)建一個(gè)繼承 NSOperation 的類(lèi)
  • 創(chuàng)建一個(gè)下載任務(wù)器蟀淮,創(chuàng)建一個(gè)隊(duì)列,任務(wù)添加隊(duì)列钞澳,這時(shí)會(huì)執(zhí)行自定義operation類(lèi)里的 main 方法
  • 在任務(wù)器中異步下載圖片
  • 返回主線程跟新UI
- (void)operation{
 
    //1.自定義一個(gè)下載的任務(wù)
    __weak typeof(self) weakSelf = self;
    DownLoadOperation *downLoadOp = [[DownLoadOperation alloc] init];
    downLoadOp.imageURLString = @"http://e.hiphotos.bdimg.com/album/pic/item/9345d688d43f8794f0ab07ddd01b0ef41ad53ae8.jpg";
    downLoadOp.finshedBlock = ^(UIImage *image){
        //NSLog(@"%@---%@",image,[NSThread currentThread]);
        
        //2.回到主線程更新UI
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            //在主線程
            weakSelf.imageView.image = image;
        }];
    };
    
    
    //2.隊(duì)列
    NSOperationQueue *concurrentQueue = [[NSOperationQueue alloc] init];
    
    //3.將我們的任務(wù),添加到隊(duì)列中,然后隊(duì)列就會(huì)調(diào)度downLoadOp,去調(diào)用downLoadOp它的main
    [concurrentQueue addOperation:downLoadOp];
}

下載容器


#import <UIKit/UIKit.h>

//typedef int MyInt;
//一般建議首字母大寫(xiě)
typedef void(^FinishedBlock)(UIImage *image);

@interface DownLoadOperation : NSOperation

// 圖片url地址
@property (nonatomic , copy) NSString *imageURLString;

// 回調(diào)的block
@property (nonatomic , copy) FinishedBlock finshedBlock;

@end
#import "DownLoadOperation.h"

@implementation DownLoadOperation

- (void)main{
    //因?yàn)槲覀兊拿恳粋€(gè)線程在使用過(guò)程中,都會(huì)產(chǎn)生對(duì)象,當(dāng)我們線程結(jié)束的時(shí)候,需要對(duì)我們?cè)谠摼€程中使用過(guò)的對(duì)象,做release
    @autoreleasepool {
        NSLog(@"---main----%@",[NSThread currentThread]);
        
        //1.1.拿著imageURLString去網(wǎng)絡(luò)上下載
        NSURL *url = [NSURL URLWithString:self.imageURLString];
        
        //1.2.去網(wǎng)絡(luò)上加載圖片
        NSData *imageData = [NSData dataWithContentsOfURL:url];
        
        //1.3.將我們從網(wǎng)絡(luò)上獲取到的圖片的二進(jìn)制,轉(zhuǎn)成UIImage
        UIImage *image = [UIImage imageWithData:imageData];
        
        //2.這個(gè)時(shí)候通過(guò)block將我們的image,傳給控制器
        if (self.finshedBlock) {
            self.finshedBlock(image);
        }
    }
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怠惶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子轧粟,更是在濱河造成了極大的恐慌策治,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兰吟,死亡現(xiàn)場(chǎng)離奇詭異通惫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)混蔼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)履腋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拄丰,你說(shuō)我怎么就攤上這事府树±” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵奄侠,是天一觀的道長(zhǎng)卓箫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)垄潮,這世上最難降的妖魔是什么烹卒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮弯洗,結(jié)果婚禮上旅急,老公的妹妹穿的比我還像新娘。我一直安慰自己牡整,他們只是感情好藐吮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著逃贝,像睡著了一般谣辞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沐扳,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天泥从,我揣著相機(jī)與錄音,去河邊找鬼沪摄。 笑死躯嫉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杨拐。 我是一名探鬼主播祈餐,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼戏阅!你這毒婦竟也來(lái)了昼弟?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奕筐,失蹤者是張志新(化名)和其女友劉穎舱痘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體离赫,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芭逝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渊胸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旬盯。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胖翰,到底是詐尸還是另有隱情接剩,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布萨咳,位于F島的核電站懊缺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏培他。R本人自食惡果不足惜鹃两,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舀凛。 院中可真熱鬧俊扳,春花似錦、人聲如沸猛遍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)螃壤。三九已至抗果,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奸晴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工日麸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寄啼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓代箭,卻偏偏與公主長(zhǎng)得像墩划,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗡综,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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