下面是一个简单的应用,表格视图的各个单元格自动异步加载各个网站的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

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

  1. swift 异步加载图片(第三方框架ImageLoader)

    import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...

  2. swift 异步加载图片

    import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...

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

    代码 <script runat="server"> protectedvoid Button1_Click(object sender, System.EventAr ...

  4. Java 爬虫遇上数据异步加载,试试这两种办法!

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

  5. Listview异步加载之优化篇

    异步加载图片基本思想: 1.      先从内存缓存中获取图片显示(内存缓冲) 2.      获取不到的话从SD卡里获取(SD卡缓冲) 3.      都获取不到的话从网络下载图片并保存到SD卡同时 ...

  6. Listview 异步加载图片之优化篇(有图有码有解释)

    在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...

  7. jQuery的AJax异步加载

    主要用到load()方法以及getScript()方法,具体以一个例子说明: 在现有html文件中加载一个拟好的片段,以及在片段加载完成之前阻止用户进一步操作的弹出框. 首先是现有html代码,无任何 ...

  8. Listview异步加载图片之优化篇

    在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...

  9. Jquery前端分页插件pagination同步加载和异步加载

    上一篇文章介绍了Jquery前端分页插件pagination的基本使用方法和使用案例,大致原理就是一次性加载所有的数据再分页.https://www.jianshu.com/p/a1b8b1db025 ...

随机推荐

  1. atexit模块解析

    atexit模块很简单,只定义了一个register函数用于注册程序退出时的回调函数,我们可以在回调函数中做一些资源清理的操作. 注意回调函数只有正常退出的时候才会调用,如果程序是被信号杀死或者因为严 ...

  2. Node.js学习笔记2(安装和配置Node.js)

            1.安装         windows下安装,在http://nodejs.org下载安装包进行安装即可.         linux下安装,使用yum或者下载源码进行编译.     ...

  3. Windows下搭建objective C开发环境

    摘自:http://blog.csdn.net/zhanghefu/article/details/18320827 最近打算针对iPhone.iPod touch和iPad开发一些应用,所以,需要开 ...

  4. git 使用详情

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...

  5. grawlew 编译

    http://somefuture.iteye.com/blog/2002052 Gradlew behind a proxy systemProp.http.proxyHost=www.someho ...

  6. Qt 错误: 无法运行 release 下的可执行文件

        学习Qt有一点时间了,但之前都是在debug版本下进行编译运行,偶然切换到release版本下,却出现了如下错误: 错误提示:   This application failed to sta ...

  7. Flow Problem(最大流)

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  8. Python重写C语言程序100例--Part9

    ''' [程序71] 题目:编写input()和output()函数输入,输出5个学生的数据记录. 1.程序分析: 2.程序源码: 使用list来模拟结构(不使用class) stu = [strin ...

  9. caffe神经网络框架的辅助工具(将图片转换为leveldb格式)

    caffe中负责整个网络输入的datalayer是从leveldb里读取数据的,是一个google实现的很高效的kv数据库. 因此我们训练网络必须先把数据转成leveldb的格式. 这里我实现的是把一 ...

  10. 打印NSLog分类 Foundation+Log.m

    #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @implementation UIView(Log) + ...