-
簡(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)載并指正

