iOS多線程篇-NSThread-線程之間的通信(下載圖片)

  • 簡(jiǎn)述

    在前兩章都只是介紹如何使用NSThread以及它的一些方法、狀態(tài),那么這一章我們來(lái)一個(gè)比較有意思的東西:
    使用多線程之間的通信來(lái)做一個(gè)下載圖片的Demo
    
  • 擼碼

    • 首先 在storyboard中拖入一個(gè)UIImageView控件并且屬性名為:imageView

    • 然后 寫(xiě)一個(gè)下載圖片的方法 并給我們的ImageView賦值

    /**
    *  下載圖片
    */
    -(void)downloadImage{
        //1.確定要下載網(wǎng)絡(luò)圖片的url地址,一個(gè)url唯一對(duì)應(yīng)著網(wǎng)絡(luò)上的一個(gè)資源
        NSURL *url = [NSURL URLWithString:@"http://images.cnblogs.com/cnblogs_com/ljy-666/730636/o_20150902105459.png"];
    
        //2.根據(jù)url地址下載圖片數(shù)據(jù)到本地(二進(jìn)制數(shù)據(jù)
        NSData *data = [NSData dataWithContentsOfURL:url];
    
        //3.把下載到本地的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成圖片
        UIImage *image = [UIImage imageWithData:data];
    
        self.imageView.image = image;
    }
    
    
    • 最后 在touchesBegan事件中調(diào)用;

    • 因?yàn)槲业?code>xcode是7.0,xcode會(huì)報(bào)一個(gè)這樣的錯(cuò)誤:


      說(shuō)阻止了明文HTTP資源的下載,因?yàn)樗话踩?,可以通過(guò)配置info.plist文件來(lái)更改

      那么這副圖以及解決了這個(gè)問(wèn)題


    • 配置完info.plist之后 我們的圖片是能夠顯示出來(lái)了,但是我們并沒(méi)有使用到多線程,那么接下來(lái)我們就使用完成這種效果,也是本章的核心:線程之間的通信

    • 簡(jiǎn)單概括

    • 1、點(diǎn)擊屏幕的時(shí)候,我們創(chuàng)建一個(gè)線程用來(lái)做耗時(shí)的下載圖片方法。

    • 2、當(dāng)圖片下載完成,我們利用線程之間的通信performSelectorOnMainThread傳遞給主線程。

    • 3、最后給我們的ImageView賦上圖片

    • 新增代碼

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //    開(kāi)啟一條子線程來(lái)下載圖片
        [NSThread detachNewThreadSelector:@selector(downloadImage) toTarget:self withObject:nil];
    }
    /**
    *  下載圖片
    */
    -(void)downloadImage{
        //1.確定要下載網(wǎng)絡(luò)圖片的url地址,一個(gè)url唯一對(duì)應(yīng)著網(wǎng)絡(luò)上的一個(gè)資源
        NSURL *url = [NSURL URLWithString:@"http://images.cnblogs.com/cnblogs_com/ljy-666/730636/o_20150902105459.png"];
    
        //2.根據(jù)url地址下載圖片數(shù)據(jù)到本地(二進(jìn)制數(shù)據(jù)
        NSData *data = [NSData dataWithContentsOfURL:url];
    
        //3.把下載到本地的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成圖片
        UIImage *image = [UIImage imageWithData:data];
    
        /*
        performSelectorOnMainThread  也是NSObject分類的一個(gè)方法
        1.在主線程執(zhí)行的方法
        2.傳遞給方法的參數(shù)
        3.是否等待被調(diào)用方法執(zhí)行完成,有可能也會(huì)等待調(diào)用方法的執(zhí)行完成!幾率極少!
        */
        [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
        NSLog(@"等于NO的話 我就不等setImage執(zhí)行,等于YES的話   我就等setImage執(zhí)行了我在執(zhí)行");
    }
    

    以上代碼就是我們本章的所有代碼了

    至于這段代碼為什么要用self.imageView而不是self,因?yàn)槟莻€(gè)方法是在NSObject類里面的,所有繼承了NSObject的類都是可以使用的,在加上setImage:這個(gè)方法在imageView里面是具有的所有我也沒(méi)有去重寫(xiě)了

    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
    
  • 結(jié)束

                  本章到此結(jié)束
            歡迎各位碼友隨意轉(zhuǎn)載并指正
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容