Swift:懒惰加载变量vs MVC模型?

时间:2016-04-02 05:06:29

标签: ios swift model-view-controller lazy-loading

我正在使用MVC模型构建应用程序。 我使用延迟加载技术来填充变量。 (模型) 这个变量由一个UIViewController(Controller)

组成

但是我不知道如何在模型操作完成时重新加载或触发视图控制器。这是我的代码

模型(延迟加载数据)

class func allQuotes() -> [IndexQuotes]
    {
        var quotes = [IndexQuotes]()
        Alamofire.request(.GET, api_indexquotes).responseJSON { response in
            if response.result.isSuccess && response.result.value != nil {
                for i in (response.result.value as! [AnyObject]) {
                    let photo = IndexQuotes(dictionary: i as! NSDictionary)
                    quotes.append(photo)
                }

            }
        }

        return quotes
    }

视图控制器的一部分

类索引:

UIViewController,UICollectionViewDelegate,UICollectionViewDataSource {

    var quotes = IndexQuotes.allQuotes()
    var collectionView:UICollectionView!

    override func viewDidLoad() {

这是一个非常严肃的问题,我混淆了什么技术将用于完全满足我的目的?

3 个答案:

答案 0 :(得分:1)

由于Alamofire异步工作,因此需要完成块才能在收到数据后返回

  class func allQuotes(completion: ([IndexQuotes]) -> Void)
  {
    var quotes = [IndexQuotes]()
    Alamofire.request(.GET, api_indexquotes).responseJSON { response in
      if response.result.isSuccess && response.result.value != nil {
        for photoDict in (response.result.value as! [NSDictionary]) {
          let photo = IndexQuotes(dictionary: photoDict)
          quotes.append(photo)
        }
      }
      completion(quotes)
    }
  }

或者有点" Swiftier"

... {
   let allPhotos = response.result.value as! [NSDictionary]
   quotes = allPhotos.map {IndexQuotes(dictionary: $0)}
}

我还建议使用原生的Swift集合类型,而不是NSArrayNSDictionary

在视图控制器的viewDidLoad中调用allQuotes并在主线程的完成块中重新加载表视图。

以小写字母开头的indexQuotes属性被假定为表视图的数据源数组

var indexQuotes = [IndexQuotes]()

override func viewDidLoad() {
  super.viewDidLoad()
  IndexQuotes.allQuotes { (quotes) in
    self.indexQuotes = quotes
    dispatch_async(dispatch_get_main_queue()) {
      self.tableView.reloadData()
    }
  }
}

答案 1 :(得分:0)

这是异步操作,只需在此处使用回调:

class func allQuotes(callback: () -> Void) -> [IndexQuotes]
    {
        var quotes = [IndexQuotes]()
        Alamofire.request(.GET, api_indexquotes).responseJSON { response in
            if response.result.isSuccess && response.result.value != nil {
                for i in (response.result.value as! [AnyObject]) {
                    let photo = IndexQuotes(dictionary: i as! NSDictionary)
                    quotes.append(photo)
                }
            }

            callback()
        }

        return quotes
    }

在你的UIViewController中:

var quotes = IndexQuotes.allQuotes() {
    self.update()
}
var collectionView:UICollectionView!

override func viewDidLoad() {
    update()
}

private func update() {
    // Update collection view or whatever.
}

实际上,我强烈建议不要在这种情况下使用类函数(以及许多其他情况),它在一段时间后不可扩展且难以维护。

答案 2 :(得分:0)

首先从viewdidLoad中调用该函数。其次使用块或委托将控制权传递回ViewController。我更喜欢块approch。您可以拥有完成和故障块。在完成块中,您可以重新加载视图,如果失败,您可以使用alertcontroller或不执行任何操作。

您可以将AFNetworking视为块的示例。