iOS开发-一次伪MVVM的实践

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]

你可能感兴趣的:(iOS开发-一次伪MVVM的实践)