Swift - 非同步載入各網站的favicon圖示,並在單元格中顯示

weixin_33831673發表於2015-10-07
下面是一個簡單的應用,表格檢視的各個單元格自動非同步載入各個網站的favicon圖示,並顯示出來。
主要是複習下如何自定義單元格,單元格中圖片的非同步載入,以及didSet的用法。

效果圖如下:
原文:Swift - 非同步載入各網站的favicon圖示,並在單元格中顯示


操作步驟:
(1)先建立單元格類 - FaviconTableViewCell.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import UIKit
 
class FaviconTableViewCell: UITableViewCell {
     
    //此操作佇列執行下載的完成處理器
   // var operationQueue:NSOperationQueue?
     
    //此單元格顯示的URL
    var url:NSURL? {
        //當URL發生變化
        didSet {
            //顯示此文字
            self.textLabel?.text = self.url?.host
             
            //建立請求
            let request = NSURLRequest(URL: self.url!)
            let session = NSURLSession.sharedSession()
             
            let dataTask = session.dataTaskWithRequest(request,
                completionHandler: {(data, response, error) -> Void in
                    //將獲取到的資料轉化成影像
                    let image = UIImage(data: data!)
                    //對UI的更新必須在主佇列上完成
                    NSOperationQueue.mainQueue().addOperationWithBlock({
                        () -> Void in
                        //將已載入的影像賦予影像檢視
                        self.imageView?.image = image
                        //影像檢視可能已經因為新影像而改變了尺寸
                        //所以需要重新調整單元格的佈局
                        self.setNeedsLayout()
                    })
 
            }) as NSURLSessionTask
             
            //使用resume方法啟動任務
            dataTask.resume()
        }
    }
 
    override func awakeFromNib() {
        super.awakeFromNib()
    }
 
    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

(2)在Main.storyboard中新增一個Table View,並將Table View的Prototype Cells(原型單元格)數改成1,Selection(選擇樣式)改稱No Selection
(3)選中單元格,將樣式設為Basic,並將Indentifier(識別符號)改為FaviconCell
(4)再把單元格的Identity Inspector(身份檢視器)改為FaviconTableViewCell
(5)最後按住Control鍵,拖動表格檢視到檢視控制器上,分別新增資料來源和委託(dataSource與delegate)
(6)ViewController.swift程式碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import UIKit
 
class ViewController: UIViewController {
     
    let hosts = ["hangge.com","163.com","baidu.com","qq.com","taobao.com"]
 
    override func viewDidLoad() {
        super.viewDidLoad()
    }
     
    //在本例中,只有一個分割槽
    func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
        return 1;
    }
     
    //返回表格行數(也就是返回控制元件數)
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.hosts.count
    }
     
    //建立各單元顯示內容(建立引數indexPath指定的單元)
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
        -> UITableViewCell
    {
        //為了提供表格顯示效能,已建立完成的單元需重複使用
        let identify:String = "FaviconCell"
        //同一形式的單元格重複使用,在宣告時已註冊
        let cell = tableView.dequeueReusableCellWithIdentifier(identify)
            as! FaviconTableViewCell
         
        let host = hosts[indexPath.row]
        let url = NSURL(string: "http://\(host)/favicon.ico")
        cell.url = url
        return cell
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

原文出自:www.hangge.com  轉載請保留原文連結:http://www.hangge.com/blog/cache/detail_873.html

相關文章