【问题标题】:MVVM architecture using swift to fetch data and update UITableViewMVVM 架构使用 swift 获取数据和更新 UITableView
【发布时间】:2016-07-18 18:59:54
【问题描述】:

我对 MVVM 架构完全陌生。我刚开始研究它,这是我第一次尝试使用 MVVM 架构编写代码。我需要从服务器下载 cmets 并将它们显示在表格视图中。我的视图是使用故事板实现的 下面是我对其他类的实现。

SECommentsViewController.swift

import UIKit

class SECommentsViewController: SEViewController, UITableViewDataSource {



    @IBOutlet weak var tableView: UITableView!
    var mediaObject: PFObject?
    var viewModel = SECommentsViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()

        viewModel.fetchCommentsForMedia(mediaObject) { (comments, error) in
            self.tableView.reloadData()
        }
    }

    // MARK: - UITableViewDataSource

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel.comments.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("SECommentCell", forIndexPath: indexPath) as! SECommentCell
        let object = viewModel.comments[indexPath.row]
        if let username = (object.objectForKey("fromUser") as? PFUser)?.objectForKey("userId") as? String {
            cell.usernameButton.setTitle(username, forState: UIControlState.Normal)
        }
        if let profileImageURLString  = ((object.objectForKey("fromUser") as? PFUser)?.objectForKey("image") as? PFFile)?.url {
            if let profileImageURL = NSURL(string: profileImageURLString) {
                cell.profileImageView.sd_setImageWithURL(profileImageURL)
            }
        }
        if let commentText = object.objectForKey("text") as? String {
            cell.commentLabel.text = commentText
        }

        return cell
    }
}

SECommentsViewModel.swift

import UIKit

class SECommentsViewModel: NSObject {

    var comments = [PFObject]()

    func fetchCommentsForMedia(mediaObject: PFObject?, completion: (comments: [PFObject]?, error: NSError?) -> Void) {
        if let media = mediaObject {
            let commentsQuery = PFQuery(className: "SEActivity")
            commentsQuery.whereKey("image", equalTo: media)
            commentsQuery.whereKey("type", equalTo: "comment")
            commentsQuery.findObjectsInBackgroundWithBlock({ (objects: [PFObject]?, error: NSError?) in
                if let theObjects = objects {
                    self.comments = theObjects
                }
                completion(comments: objects, error: error)
            })
        }
        else {
            completion(comments: nil, error: nil)
        }
    }
}

SECommentCell.swift

import UIKit

class SECommentCell: UITableViewCell {

    @IBOutlet weak var profileImageView: UIImageView!
    @IBOutlet weak var usernameButton: UIButton!
    @IBOutlet weak var commentLabel: UILabel!
    var commentUser: PFUser?
}

我觉得这与网络代码在 ViewModel 而不是 ViewController 中的 MVC 没有什么不同。所以我想我可能做得不对。如果您能告诉我我的方向是否正确以及是否有任何建议,我将不胜感激。

提前谢谢你。

注意:关于面向协议的 MVVM 的文章给我留下了深刻的印象,但不知道如何开始我的特定示例。 Click here to see the article

【问题讨论】:

    标签: ios swift uitableview model-view-controller mvvm


    【解决方案1】:

    我建议使用 ReactiveCocoa 库 (https://github.com/ReactiveCocoa/ReactiveCocoa),它可以让您在许多其他函数中监听信号。

    然后,您可以将所有网络调用都放在 ViewModel 中,但不要使用回调,而是使用 SignalProducer。

    所以在你的 ViewModel 中你可以这样做:

    func fetchData() -> SignalProducer<[PFObject], NSError> {
        return SignalProducer { event, disposable in
            // Your network code here, and on completion / error do
            event.sendNext(array)
            event.sendCompleted()
            // On error do
            event.sendError(error)
        }
    }
    

    另外,不要直接从视图中访问您的 cmets 数组,而是实现类似的方法

    func getDataSourceCount()
    func getItemAtIndexPath()
    

    【讨论】:

      猜你喜欢
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      相关资源
      最近更新 更多