GitHub地址
前几天看到有个MVVM的小项目,一直都用的MVC写的项目,这次也打算尝试换个架构,虽然自己写的感觉就是个伪MVVM,就是把加载数据的代码丢到了别的文件而已,另外这个实践是用了Swift写的,个人认为适合初学者学习.
-
用到的第三方框架
-
Alamofire
网络请求框架 -
Kingfisher
类似SDWebImage -
SnapKit
布局框架 -
SwiftyJSON
解析JSON框架
-
这个实践的目的就是将不该属于控制器来管的网络加载部分丢到外面,通过闭包将需要展示的数据拿到就好了,网络加载部分放在
ViewModel
里面
typealias cellViewModelSuccessCallBack = (dataSoure: Array) -> Void
typealias cellViewModelFaildCallBack = (error: NSError) -> Void
static func loadCellData(success: cellViewModelSuccessCallBack?, faild: cellViewModelFaildCallBack?) {
let parameters = ["limit": 20,
"skip": 0]
Networking.get(mainUrl, parameters: parameters, success: { (json) in
var others: [cellModel]?
others = []
if let items = JSON(json)["data"]["results"].array {
for item in items {
others?.append(cellModel(json: item))
}
if success != nil {
success!(dataSoure: others!)
}
}
}) { (error) in
}
}
个人认为Swift和OC在网络处理这块其实差距蛮大的,OC基本就用MJ框架完成解析JSON和字典转模型,然而Swift略微麻烦点,需要指定类型.
class cellModel: NSObject {
var newsImage: String?
var newsTitle: String?
var newsSource: String?
var newsTypeName: String?
init(json: JSON) {
newsImage = json["newsImage"].string
newsTitle = json["newsTitle"].string
newsSource = json["newsSource"].string
newsTypeName = json["newsTypeName"].string
}
convenience init(object: AnyObject) {
self.init(json: JSON(object))
}
func dictionaryRepresentation() -> [String : AnyObject ] {
var dictionary: [String : AnyObject ] = [ : ]
if newsImage != nil {
dictionary.updateValue(newsImage!, forKey: "newsImage")
}
if newsTitle != nil {
dictionary.updateValue(newsTitle!, forKey: "newsTitle")
}
if newsSource != nil {
dictionary.updateValue(newsSource!, forKey: "newsSource")
}
if newsTypeName != nil {
dictionary.updateValue(newsTypeName!, forKey: "newsTypeName")
}
return dictionary
}
}
这是模型层的处理
自定义cell
是代码写的布局,在init
方法内完成子控件的创建,在layoutSubviews
方法内完成子控件的布局,在这个方法内必须调用父类的layoutSubviews
,否则会有Bug
然后通过在控制器调用该方法完成cell
的创建
static func tableViewCell(tableView: UITableView, indexPath: NSIndexPath, model: cellModel) -> TableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier(cellID) as? TableViewCell
if cell == nil {
cell = TableViewCell(style: .Default, reuseIdentifier: cellID)
}
cell?.iconImage!.kf_setImageWithURL(NSURL(string: model.newsImage!)!)
cell?.titleLabel!.text = model.newsTitle
cell?.sourceLabel!.text = model.newsSource
cell?.typeLabel!.text = model.newsTypeName
return cell!
}
本篇文章也就适合初学者学习参考下,大神就随便看看吧,各位若有不明白的可以留言或者发送邮件[email protected]