swift詳解之十四,swift詳解

來源:互聯網
上載者:User

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非同步擷取網狀圖片

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.