在UITableView出现之前,将自定义类之间的PFObject传递给viewController

时间:2015-12-19 19:57:02

标签: ios swift parse-platform

我正在使用swift 2和Xcode 7构建iOS应用程序,我想在MODEL和CONTROLLER之间进行分离。因此,我构建了一个自定义类,用于查询 Parse 中的数据并加载一个数组[在host类中找到]。

问题是 - 在ViewController类中找到的UITableView在iPhone屏幕上加载为空,因为该数组应该填充ViewController,直到比它为止。输出是:在tableview在屏幕上查看后,对象的数组加载,因此它是空表视图。

我需要知道如何让屏幕等待查看,直到PFObject加载对象。

自定义类,用于从解析中查询数据。

UITableView

ViewController:

import Foundation
import Parse
import ParseTwitterUtils

class ParseQueryObject {

    init(className:String) {

        let query = PFQuery(className: "Tasks")            
        query.findObjectsInBackgroundWithBlock { (taskLista:[PFObject]?, error:NSError?) -> Void in

            if error == nil {
                taskList = taskLista as [PFObject]!
            } 
            else {
                print(error?.description)
            }
        }
    }        
}

}

2 个答案:

答案 0 :(得分:0)

这是一个很好的开始。关键的想法是要意识到异步运行的函数经常需要告诉调用者他们已经完成了。您的视图控制器需要知道它可以重新加载tableView。就像解析的sdk一样,你的查询init方法应该用回调声明......

func init(className:String, completion: (results:[PFObject]?, error:NSError?) -> Void) {
    // your code as you have it, then, when inside the find...
    query.findObjectsInBackgroundWithBlock { // ...
        if error == nil {
            taskList = taskLista as [PFObject]!
            completion(results:taskLista, error:nil)
        }
        // ...
}

现在,您的视图控制器可以知道查询何时完成,因此何时更新UI ...

self.tableView.dataSource = self
ParseQueryObject.init(className: "Tasks" completion: { (taskLista:[PFObject]?, error:NSError?) -> Void in
    self.tableView.reloadData()
})

答案 1 :(得分:0)

为了更好地澄清代码责任,init应始终使用初始化代码而不是进行调用,并完成指示加载数据的完成。我认为这是初始化过程的结束。相反,您可以使用其他类似func loadData(completion: (results:[PFObject]?, error:NSError?) -> Void)的方法。

除了不从reloadData()拨打UITableView外,无论你写了什么都没有问题。