swift詳解之十四,swift詳解
NSThread 非同步下載圖片
在IOS中處理多線程有三個方案 , NSThread 、NSOperation 、GCD 。當然GCD應該是最方便的 ,我們一個一個學 。先理解底層的,最後再使用最方便的 。
NSThread:
優點:NSThread 比其他兩個輕量級
缺點:需要自己管理線程的生命週期,線程同步。線程同步對資料的加鎖會有一定的系統開銷
我們先研究下用NSThread 非同步載入網狀圖片 :
NSThread有兩種建立方式 ,一種是通過執行個體方法。一種是通過類方法。
let thread = NSThread(target: self, selector: "doSomeThing", object: nil); NSThread.detachNewThreadSelector("doSomeThing1", toTarget: self, withObject: nil);
通過類方法建立的自動開啟,通過執行個體方法建立的要手動調用start() 方法去開啟
let picAddress = "http://www.apple.com/euro/ios/ios8/a/generic/images/og.png" let picAddress1 = "https://avatars2.githubusercontent.com/u/8502419?v=3&s=400"
這裡我們先定義兩張來自網路的圖
@IBOutlet weak var activity: UIActivityIndicatorView!@IBOutlet weak var imageView: UIImageView!
然後向介面上託了兩個控制項 , 一個UIImageView 用來展示圖片,一個UIActivityIndicatorView 展示載入時候轉圈圈。
然後再搞兩個按鈕。就不了,後面源碼附上 。
在viewDidLoad方法中設定activity.hidden = true 讓那個activity控制項預設是隱藏的
第一個按鈕點擊事件的代碼
activity.hidden = false activity.startAnimating() NSThread.detachNewThreadSelector("downLoadImage", toTarget: self, withObject: nil);
顯示控制項,開啟動畫, 開啟一個線程
selector :線程執行的方法,這個selector只能有一個參數,而且不能有傳回值。 target :selector訊息發送的對象 withObject:傳輸給target的唯一參數,也可以是nil
這是對那三個參數的解釋。
func downLoadImage(){ print("我要下載圖片啦") if let url = NSURL(string: picAddress) { if let data = NSData(contentsOfURL: url){ let img = UIImage(data: data) if(img != nil){ //由於swift中暫時還沒有這個方法 。 performSelectorOnMainThread 那就先用用gcd的方法了 dispatch_async(dispatch_get_main_queue()) { self.imageView.image = img!; self.activity.hidden=true print("圖片下載完啦") } }else{ print("baidu") } }else{ print("沒從url中拿到圖") } }else{ print("沒拿到url") } }
這個是線程實行的方法 , 下載到資料後通過主線程更新UI
另一個按鈕的方法
activity.hidden = false activity.startAnimating() let thread = NSThread(target: self, selector: "downLoadImage1:", object: picAddress1); thread.start();
這裡傳了一個參數,其實兩個可以用一個方法。傳不同的地址就行了,這裡為了多學點。用了兩個方法測試 。
func downLoadImage1(str:String){ print("我要下載圖片啦") if let url = NSURL(string: str) { if let data = NSData(contentsOfURL: url){ let img = UIImage(data: data) if(img != nil){ //由於swift中暫時還沒有這個方法 。 performSelectorOnMainThread 那就先用用gcd的方法了 dispatch_async(dispatch_get_main_queue()) { self.imageView.image = img!; self.activity.hidden=true print("圖片下載完啦") } }else{ print("baidu") } }else{ print("沒從url中拿到圖") } }else{ print("沒拿到url") } }
這是第二個按鈕的方法
效果就是點一個按鈕,轉圈圈等待。然後顯示圖片,點另一個也是等待然後顯示圖片。
xcode 6 ,NSData可以獲得大多數網狀圖片 , XCode 7 beta 有很多圖片擷取不到 。估計是安全性問題。 現在還沒找到好的辦法 。
本人使用xcode 7 beta 代碼也附上吧
: swift非同步擷取網狀圖片
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。