代码中用到了代理,就是将DataRequest中解析的Json串传到ViewController中进行TableViewCell的绘制,详情请见注释!
//
// Protocol.swift
import Foundation
protocol DataRequestDelegate{
func changeJson(item:AnyObject)
}
//
// DataRequest.swift
import Foundation
import Alamofire
class DataRequest: NSObject{
var item:[TableViewCellModel] = []
var num:Int?
var delegate:DataRequestDelegate?
func alamofireRequest(){
var model:TableViewCellModel!
//Alamofire的异步问题
Alamofire.request(.GET, "http://m.paopao.163.com/m/v2/getDiscover", parameters: ["foo": "bar"])
.responseJSON { response in
if let JSON = response.result.value {
if let json = JSON.objectForKey("result")?.objectForKey("list"){
self.num = json.count
for var i = 0; i<json.count; i = i + 1{
let str1 = json[i].objectForKey("title")as! String
let str2 = json[i].objectForKey("subTitle")as! String
let str3 = json[i].objectForKey("imageUrl")as! String
model = TableViewCellModel(titleName: str1, subTitleName: str2, imageUrlName: str3)
self.item.append(model)
}
//调用代理方法
self.delegate?.changeJson(self.item)
}
}
}
}
}
//
// MyTableViewCellModel.swift
import Foundation
class TableViewCellModel: NSObject{
var titleName:String!
var subTitleName:String!
var imageUrlName:String!
init(titleName:String,subTitleName:String,imageUrlName:String){
self.titleName = titleName
self.subTitleName = subTitleName
self.imageUrlName = imageUrlName
}
}
//
// discoveryViewController.swift
import UIKit
import Alamofire
class discoveryViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,DataRequestDelegate {
var tableView = UITableView()
let size = UIScreen.mainScreen().bounds
//定义数组
var items:[TableViewCellModel] = []
var num:Int!
//代理方法的实现
func changeJson(item: AnyObject) {
self.items = item as! [TableViewCellModel]
self.tableView.reloadData()
// print(self.items)
}
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = "发现"
tableView = UITableView(frame: CGRectMake(0, 0, size.width, size.height), style: UITableViewStyle.Plain)
tableView.rowHeight = 60
//网络请求
let request = DataRequest()
request.delegate=self
request.alamofireRequest()
tableView.delegate = self
tableView.dataSource = self
self.view.addSubview(tableView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let initIdentifier = "Cell"
//访问缓存池
var cell = self.tableView.dequeueReusableCellWithIdentifier(initIdentifier)
//如果cell为空,则重新创建
if (cell == nil) {
cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: initIdentifier)
}
let model:TableViewCellModel = self.items[indexPath.row]
cell?.textLabel!.text = model.titleName
cell?.detailTextLabel!.text = model.subTitleName
cell?.imageView!.image = UIImage(data: NSData(contentsOfURL: NSURL(string: model.imageUrlName)!)!)
cell!.imageView!.layer.cornerRadius = 40
cell!.imageView!.layer.masksToBounds = true
return cell!
}
//当执行异步请求的时候,如果count为0的时候,就不绘制,等到有数据了再reloadData就可以绘制cell
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let webView = UIWebView(frame: UIScreen.mainScreen().bounds)
let request = NSURLRequest(URL: NSURL(string: "http://www.baidu.com")!)
webView.loadRequest(request)
self.view.addSubview(webView)
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 80
}
}
总结:
通常,一个delegate的使用过程,需要经过五步:
1. 创建一个 delegate;
2. 委托者声明一个delegate;
3. 委托者调用delegate内的方法(method);
4. 被委托者设置delegate,以便被委托者调用;
5. 被委托者实现Delegate 所定义的方法。