UItableView结合网络请求,多线程,数据解析,MVC实战

学了这么久的swift都没有做过什么东西,今天就以自己的一个小小的联系,讲一下,怎么使用swift在实战中应用MVC,并且结合后面的高级知识:网络请求,JSON数据解析一起应用到一个项目中来。

好了,废话不多说,我们直接开始吧。

首先看看最终的效果:

是不是很简单,就是个UItableView显示一些简单的数据,如果你真的觉得太简单了,那么请绕道,寻找更深入东西,但或者没有你想的那么简单,这不仅仅是一个tableView,为什么呢?下面我就给大家详细介绍一下。

一:首先,既然说到MVC,我们肯定要先从模型开始,新建一个模型类。

因为我们只是现实一张图片和一行文件,所以模型中非常简单,两行代码:

 import UIKit

 class DataModel: NSObject
 {
     // 文字
     var title : String = ""

     // 图片
     var photh : String = ""

 }

二:然后创建一个自定义Cell,并且和我们前面一样实现相应的方法,并且在里面实现相应的代码:

1:创建两个控件对应的属性:

     // 文字
     var titleLable : UILabel?
     // 图片
     var photoImageView : UIImageView?

2:实现init方法,并且在里面调用loadView方法来实现控件的初始化:

 override init(style: UITableViewCellStyle, reuseIdentifier: String!)
     {
         super.init(style: style, reuseIdentifier: reuseIdentifier)

         loadView()

     }
     func loadView()
     {
         titleLable = UILabel(frame: CGRectMake(, , , ))
         titleLable!.textAlignment = NSTextAlignment.Left
         titleLable!.numberOfLines =
         self.addSubview(titleLable!)

         photoImageView = UIImageView(frame: CGRectMake(, , , ))
         self.addSubview(photoImageView!)

     }

3:然后通过模型来加载数据,这里涉及到了网络请求的知识,请多留意蓝色部分代码:

     func loadData(item:DataModel)
     {
         titleLable?.text = item.title

         // 图片转换
         var thumbQueue = NSOperationQueue()

         var urlString = (item.photh as String)
         var url = NSURL(string: urlString)!
         let request = NSURLRequest(URL: url)

13         /**
14         <#(NSURLResponse!, NSData!, NSError!) -> Void##(NSURLResponse!, NSData!, NSError!) -> Void#>
15         自己命名
16         */
17
18         //NSURLConnection.sendAsynchronousRequest(request, queue: thumbQueue, completionHandler: )
19        // <#(NSURLResponse!, NSData!, NSError!) -> Void##(NSURLResponse!, NSData!, NSError!) -> Void#>
20
21
22
23 //        NSURLConnection.sendAsynchronousRequest(request, queue: thumbQueue) { (response, data, error) -> Void in
24 //            let image = UIImage.init(data :data)
25 //            dispatch_async(dispatch_get_main_queue(), { () -> Void in
26 //                self.photoImageView!.image = image
27 //            })
28 //
29 //        }
30
31
32         NSURLConnection.sendAsynchronousRequest(request, queue: thumbQueue, completionHandler: { response, data, error in
33             if (error != nil) {
34                 println(error)
35
36             } else {
37                 let image = UIImage.init(data :data)
38                 dispatch_async(dispatch_get_main_queue(), { () -> Void in
39                     self.photoImageView!.image = image
40                 })
41
42             }
43         })

         photoImageView?.layer.masksToBounds = true
         photoImageView?.layer.cornerRadius =
         photoImageView?.image = UIImage(named: item.photh)

     }

3:下面是系统自动实现的方法;

     required init(coder aDecoder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }

     override func setSelected(selected: Bool, animated: Bool) {
         super.setSelected(selected, animated: animated)

         // Configure the view for the selected state
     }

     override func awakeFromNib() {
         super.awakeFromNib()
         // Initialization code
     }

三:然后就是控制器里面了

1:定义相应的属性

  • 1:定义一个UItableView
  • 2:定义一个可变数组
  • 3:定义一个队列(这里涉及到了多线程)
  • 4:定义一个网络请求的api链接
  • 5:定义一个刷新控件
     var tableView : UITableView!
     var dataArray : NSMutableArray = []
     var thumbQueue = NSOperationQueue()
     let hackerNewsApiUrl = "http://qingbin.sinaapp.com/api/lists?ntype=%E5%9B%BE%E7%89%87&pageNo=1&pagePer=10&list.htm"
     let refreshControl = UIRefreshControl()

2:ViewDidLoad中调用相应的方法

     override func viewDidLoad() {
         super.viewDidLoad()
         // Do any additional setup after loading the view, typically from a nib.

         self.title = "自定义Cell-下拉刷新"

         // 创建TableView
         createTableView()
         // 下载数据
         loadData()

     }

3:创建TableView方法的实现

     func createTableView()
     {

         // TableView
         self.tableView = UITableView(frame: CGRectMake(, , view.frame.size.width, view.frame.size.height))
         self.tableView.dataSource = self
         self.tableView.delegate = self
         view.addSubview(self.tableView)

         refreshControl.attributedTitle = NSAttributedString(string: "下拉刷新")
         refreshControl.addTarget(self, action: "loadDataSource", forControlEvents: UIControlEvents.ValueChanged)
         self.tableView.addSubview(refreshControl)

     }

4:加载数据

  • 1:通过URL发送请求
  • 2:实现一步请求的发送
  • 3:使用GCD多多线程实现界面的现实(在主线程中)
  • 4:解析加载的json数据(这里可以使用框架SwiftyJSON)
  • 5:使用刷新控件实现更好的用户交互效果
     // MARK: - 加载数据
     func loadDataSource()
     {
         var loadURL = NSURL(string: hackerNewsApiUrl)!
         var request = NSURLRequest(URL: loadURL)
         // 线程
         var loadDataSourceQueue = NSOperationQueue()

         NSURLConnection.sendAsynchronousRequest(request, queue: loadDataSourceQueue, completionHandler: { response, data, error in
             if (error != nil)
             {
                 println(error)
                 dispatch_async(dispatch_get_main_queue(), {
                     //                    self.refreshControl?.endRefreshing()
                 })
             }
             else
             {
                 let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary
                 let newsDataSource = json["item"] as! NSArray

                 dispatch_async(dispatch_get_main_queue(),

                     {
                         self.dataArray = NSMutableArray()
                         // 遍历数组
                         for dict  in newsDataSource
                         {
                             var item = DataModel()
                             item.title = dict["title"] as! String
                             item.photh = dict["thumb"] as! String
                             self.dataArray.addObject(item)
                             println(dict["title"])
                             println(dict)
                         }

                         // 刷新时间
                         var sendDate = NSDate()
                         var dateformatter = NSDateFormatter()
                         dateformatter.setLocalizedDateFormatFromTemplate("yyyy年MM月dd日 hh:mm:ss")
                         var loactionTime = String()
                         loactionTime = dateformatter.stringFromDate(sendDate)
                         var title = NSAttributedString(string: "上次刷新时间\(loactionTime)")
                         self.refreshControl.attributedTitle = title
                      // 刷新结束
                     self.refreshControl.endRefreshing()

                         // 刷新Cell
                         self.tableView.reloadData()

                 })
             }
         })

     }
     func loadData()
     {
     }

5:实现UITableView数据源和代理方法,设置对应的属性来显示数据到界面上:

     // MARK:- UITableViewDataSource
     func numberOfSectionsInTableView(tableView: UITableView) -> Int
     {

     }
     func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
     {
         println(dataArray.count)

         return self.dataArray.count
     }
     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
     {
         println(dataArray)

         self.tableView.registerClass(ImageCell.self, forCellReuseIdentifier: "cell")
         var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ImageCell
         cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
          //cell = ImageCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell")

         var item = DataModel()
         item = self.dataArray[indexPath.row] as! DataModel

         {
             cell.loadData(item)

         }
         return cell
     }
     func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
     {

     }
     func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
     {
         println("row = %d",indexPath.row)
         var detailVC = DetailViewController()
     self.navigationController?.pushViewController(detailVC, animated: true)
     }

当我们点击对应的行,就会跳到对应行的详细界面:

加载这一行中对应的数据

     var detailID = NSInteger()
     var detailURL = "http://qingbin.sinaapp.com/api/html/108035.html"
     var webView = UIWebView()

     override func viewDidLoad() {
         super.viewDidLoad()

         // Do any additional setup after loading the view.
         view.backgroundColor = UIColor.whiteColor()
         self.title = "Detail"

         self.webView.frame = CGRectMake(, , view.frame.size.width, view.frame.size.height)
         self.webView.scalesPageToFit = true
         self.webView.delegate = self
         view.addSubview(self.webView)

         loadData()
     }

     override func didReceiveMemoryWarning() {
         super.didReceiveMemoryWarning()
         // Dispose of any resources that can be recreated.
     }
     func loadData()
     {
         var url = NSURL(string: self.detailURL)
         var urlRequest = NSURLRequest(URL: url!)
         webView.loadRequest(urlRequest)
     }
     // MARK: - UIWebViewDelegate
     // 加载失败
     func webView(webView: UIWebView, didFailLoadWithError error: NSError)
     {
         println(error)
     }
     // 加载完成
     func webViewDidFinishLoad(webView: UIWebView)
     {
         println("完成加载\(webView)")
     }
     // 开始加载
     func webViewDidStartLoad(webView: UIWebView)
     {
         println("开始加载\(webView)")
     }
     func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool
     {
         return true
     }

点击之后显示的节目如下:

iOS开发——实战篇Swift篇&UItableView结合网络请求,多线程,数据解析,MVC实战的更多相关文章

  1. iOS开发——技术精华Swift篇&Swift 2.0和Objective-C2.0混编之第三方框架的使用

    swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引 ...

  2. iOS开发——新特性Swift篇&Swift 2.0 异常处理

    Swift 2.0 异常处理 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主要围绕这个方面进行讨论. 如何建造异常类型? 在 i ...

  3. iOS网络请求之数据解析

    JSON解析 IOS中Json解析的四种方法 NSURLConnection-网络请求浅析 IOS开发:官方自带的JSON使用 XML 解析 GDataXMLNode应用 IOS学习:常用第三方库(G ...

  4. ios开发——实用技术总结Swift篇&swift常用开发技术总结

    swift常用开发技术总结 懒加载:属性,数组(字典),控件... 数组(懒加载): lazy var shops:Array<Dictionary<String, String>& ...

  5. iOS开发——图形编程Swift篇&CAShapeLayer实现圆形图片加载动画

    CAShapeLayer实现圆形图片加载动画 几个星期之前,Michael Villar在Motion试验中创建一个非常有趣的加载动画. 下面的GIF图片展示这个加载动画,它将一个圆形进度指示器和圆形 ...

  6. iOS开发零基础--Swift篇 元组

    元组的介绍 元组是Swift中特有的,OC中并没有相关类型 它是什么呢? 它是一种数据结构,在数学中应用广泛 类似于数组或者字典 可以用于定义一组数据 组成元组类型的数据可以称为“元素” 元组的定义 ...

  7. iOS开发零基础--Swift篇 循环

    循环的介绍 在开发中经常会需要循环 常见的循环有:for/while/do while. 这里我们只介绍for/while,因为for/while最常见 for循环的写法 最常规写法 // 传统写法 ...

  8. iOS开发零基础--Swift篇:逻辑分支

    一. 分支的介绍 分支即if/switch/三目运算符等判断语句 通过分支语句可以控制程序的执行流程 二. if分支语句 和OC中if语句有一定的区别 判断句可以不加() 在Swift的判断句中必须有 ...

  9. iOS开发零基础--Swift篇:Swift中数据类型

    Swift类型的介绍 Swift中的数据类型也有:整型/浮点型/对象类型/结构体类型等等 先了解整型和浮点型 整型 有符号 Int8 : 有符号8位整型 Int16 : 有符号16位整型 Int32 ...

  10. ios开发——实用技术篇Swift篇&播放MP3

    播放MP3 // MARK: - 播放MP3 /*----- mp3 ------*/ //定时器- func updateTime() { //获取音频播放器播放的进度,单位秒 var cuTime ...

随机推荐

  1. python中的文件

    Python文件 1.    概述 文件对象不仅可以用来访问普通的磁盘文件,也可以访问任何其他类型抽象层面上的文件. 内建函数open()以及file()提供了初始化输入输出(I/O)操作的通用接口. ...

  2. nagios高可用性设置

    1. 前言 如何来实现nagios监控系统的高可用,监控是很重要的,在关键时刻进行通知报警,通知人员进行相应的处理. 在进行配置的时候,需要配置两台相同服务的nagios服务器,配置相同,同时在运行, ...

  3. hadoop是什么?

    在如今这个信息高速发展的今天,hadoop也越来越火了,那么到底是什么原因让hadoop如此的火,接下来新霸哥将详细的为了介绍,并让你快速的任何hadoop是什么? hadoop思想起源:Google ...

  4. 图解WPF程序打包全过程

    首先打开已经完成的工程,如图: 下面开始制作安装程序包. 第一步:[文件]——[新建]——[项目]——安装项目. 名称——可以自己根据要求修改. 位置——是指你要制作的安装文件存放在什么目录内,可以根 ...

  5. dom 冒泡事件

    <!doctype html> <html> <head> <meta charset="utf-8"> <style> ...

  6. dom 关键字提示

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 轻松学习Linux之认识内存管理机制

    本文出自 "李晨光原创技术博客" 博客,谢绝转载!

  8. ipython, 一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数

    一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数. 若用的是fish s ...

  9. python 应用xml.dom.minidom读xml

    xml文件 <?xml version="1.0" encoding="utf-8"?> <city> <name>上海&l ...

  10. PPPOE拨号演练

    搭建PPPOE服务器,拓扑如下 PPP-Server配置如下: (config)#bba-group pppoe global (config-bba-group)#virtual-template ...