2016-03-30 7 views
4

MVVMアーキテクチャは全く新しいです。私はちょうどそれを研究し始めた、これはMVVMアーキテクチャを使用してコードを書く私の最初の試みです。私は、サーバーからコメントをダウンロードし、それらをテーブルビューで表示する必要があります。私の見解はストーリーボードを使って実装されています以下は他のクラスの実装です。MVVMアーキテクチャを使用してデータを取得し、UITableViewを更新する

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? 
} 

これはネットワークコードがビューモデルであるMVC違いはありませんような気むしろそのViewController。だから私はそれを正しくやっていないかもしれないと思う。あなたが正しい方向に行くかどうか、また何か提案があるかどうかを私に知らせることができれば、私は感謝します。

ありがとうございます。

注:私は非常にプロトコル指向のMVVMの記事に感銘を受けましたが、私の特定の例を開始する方法については考えがありませんでした。 Click here to see the article

答えて

3

ReactiveCocoaライブラリー(https://github.com/ReactiveCocoa/ReactiveCocoa)を使用することをお勧めします。このライブラリーでは、シグナルをリッスンすることができます。

次に、すべてのネットワークコールをViewModelに置くことができますが、コールバックを使用する代わりに、SignalProducerを使用します。

だからあなたのViewModelにあなたはこのような何か行うことができます:

func getDataSourceCount() 
func getItemAtIndexPath() 
のようなメソッドを実装し、むしろビューから直接ご意見アレイにアクセスするよりも、また

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) 
    } 
} 

関連する問題