Swift - 异步加载各网站的favicon图标,并在单元格中显示

下面是一个简单的应用,表格视图的各个单元格自动异步加载各个网站的favicon图标,并显示出来。

主要是复习下如何自定义单元格,单元格中图片的异步加载,以及didSet的用法。

效果图如下:

操作步骤:

(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

时间: 2024-12-27 23:22:49

Swift - 异步加载各网站的favicon图标,并在单元格中显示的相关文章

【转】GridView 加载空行并点击编辑每一个单元格

1 代码 2 3 <script runat="server"> 4 protectedvoid Button1_Click(object sender, System.EventArgs e) 5 { 6 GridView1.DataSource = GetData(); 7 GridView1.DataBind(); 8 } 9 10 protectedvoid Button2_Click(object sender, System.EventArgs e) 11 {

Swift - 异步加载图片

下面是一个异步请求加载图片数据的样例 1 2 3 4 5 6 7 8 9 10 11 //定义NSURL let imgURL:NSURL=NSURL(string:"http://hangge.com/blog/images/logo.png")! //定义NSURLRequest let request:NSURLRequest=NSURLRequest(URL:imgURL) //异步获取图片 NSURLConnection.sendAsynchronousRequest(req

关于异步加载的 javascript 不出现在 chrome 开发者工具的 source 中的解决方法

首先,当你看到这篇文章时,我相信你已经是一个中级甚至是高级的前端开发了. 因为异步加载 javascript 这样的做法,在一些中小型项目几乎是看不到的. 而异步加载 javascript 归根到底,是为了性能优化,防止 JS 加载造成页面阻塞. 会注意到性能,说明你已经不再是一个停留在实现层面的前端开发了,而是一个有着更高追求的人. 在此,向所有有追求的人点赞~~~ 昨天为公司的项目做前端优化,其中一项就是做脚本异步加载. 但是奇怪的是,异步加载的 js 出现在 chrome 开发者工具的 n

Unreal Engine 4 —— 异步加载关卡的实现方法及思考

这篇文章介绍了在ue4中实现异步加载关卡的方法,以及我对应的思考. 背景 在很多游戏中都有用到关卡的异步加载,关卡的异步加载指的是在游戏的某个阶段,使用多线程的方法进行新关卡对应的内容加载.从而能够免去直接的Loading阶段,提升游戏体验的效果. 目前这种方法被广泛运用于各种游戏,例如在游戏战神Ⅲ中,主角有时会走过一段长长的山道,在此时实际上游戏就已经在开始加载下一个关卡了(当主角走出山道时如果还没有加载完,则会显示Loading界面):又例如在游戏暗黑血统Ⅱ中,主角解开谜题从一个房间进入下一

jQuery的AJax异步加载片段

主要用到load()方法以及getScript()方法,具体以一个例子说明: 在现有html文件中加载一个拟好的片段,以及在片段加载完成之前阻止用户进一步操作的弹出框. 首先是现有html代码,无任何内容: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>AJax异步加载</title> <scri

Listview异步加载图片之优化篇

在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题有待优化.有鉴于此,本人在网上找了个相对理想的版本并在此基础上进行改造,下面就让在下阐述其原理以探索个中奥秘,与诸君共赏… 贴张效果图先: 2013-2-1 17:25 上传 下载附件 (214.08 KB) 异步加载图片基本思想: 1.      先从内存缓存中获取图片显示(内

图片高效加载(二) 图片的异步加载

图片的异步加载是利用AsynTask类对图像进行后台加载完成后再给ImageView,先转载一篇前人的较好的总结后面再添加一些自己的见解和贴上完整的实现demo. 前面的转自:https://my.oschina.net/rengwuxian/blog/183802 摘要: 有没有过这种体验:你在Android手机上打开了一个带有含图片的ListView的页面,用手猛地一划,就见那ListView嘎嘎地卡,仿佛每一个新的Item都是顶着阻力蹦出来的一样?看完这篇文章,你将学会怎样避免这种情况的发

25.使用getScript()方法异步加载并执行js文件

使用getScript()方法异步请求并执行服务器中的JavaScript格式的文件,它的调用格式如下所示: jQuery.getScript(url,[callback])或$.getScript(url,[callback]) 参数url为服务器请求地址,可选项callback参数为请求成功后执行的回调函数. 例如,点击“加载”按钮,调用getScript()加载并执行服务器中指定名称的JavaScript格式的文件,并在页面中显示加载后的数据内容,如下图所示: 在浏览器中显示的效果: 从图

设备驱动的异步加载 —— 示例分析(1)

li {list-style-type:decimal;}ol.wiz-list-level2 > li {list-style-type:lower-latin;}ol.wiz-list-level3 > li {list-style-type:lower-roman;}blockquote {padding:0 12px;padding:0 0.75rem;}blockquote > :first-child {margin-top:0;}blockquote > :last-