【问题标题】:How do I call a function only if another function is complete? (Swift and retrieving from Parse)只有当另一个函数完成时,我如何调用一个函数? (Swift 并从 Parse 中检索)
【发布时间】:2015-12-13 15:30:02
【问题描述】:

如果我在单独的函数中从我的 Parse 后端检索到某个 PFObject,我试图只调用一个函数only。目前我在设置延迟3.0 后调用第二个函数并且它正在工作,但前提是在3.0 内调用第一个查询函数,否则我必须在第一个之后pullToRefresh tableView函数最终完成以填充 Parse 数据。 (顺便说一下,我使用的是PFQueryTableViewController)

这是我目前的代码(我知道queryForTable 是一个覆盖,所以无论如何都会被调用,所以有没有办法将其更改为普通函数?):

override func viewDidLoad() {

    // ideally want something like "if getX'IsComplete' then queryForTable() and self.loadObjects()"

    retrieveFirstX()

    let delay = 3.0 * Double(NSEC_PER_SEC) // retrieveFirstX must load within 3.0 for table to populate without needing to pullToRefresh
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue(), {

        self.queryForTable()
        self.loadObjects()
    })
}

var X = PFObject(className: "X")

func retrieveFirstX() -> Bool {

    let xQuery = PFQuery(className: "X")
    xQuery.orderByDescending("createdAt")
    xQuery.getFirstObjectInBackgroundWithBlock {
        (object: PFObject?, error: NSError?) -> Void in
        if error == nil {

            self.X = object!
        }
    }
    return true
}

 override func queryForTable() -> PFQuery {

    let xRelation = X.relationForKey("xPosts") as PFRelation!
    let relationQuery = xRelation.query()

    let xPostsQuery = PFQuery(className: "Posts")
    xPostsQuery.includeKey("postUser")
    xPostsQuery.whereKey("objectId", matchesKey: "objectId", inQuery: relationQuery)
    xPostsQuery.cachePolicy = .NetworkElseCache
    xPostsQuery.orderByDescending("createdAt")
    return xPostsQuery
}

我是否需要使用完成处理程序,如果需要,我以前从未使用过它们该怎么做?

提前致谢!

【问题讨论】:

    标签: swift function parse-platform pfquery pfquerytableviewcontrolle


    【解决方案1】:

    完成处理程序听起来不错,类似于:

    override func viewDidLoad() {
        let completionHandler = {
            self.queryForTable()
            self.loadObjects()
        }
        retrieveFirstX(completionHandler)
    }
    
    func retrieveFirstX(completion: ()->()) -> Bool {
        let xQuery = PFQuery(className: "X")
        xQuery.orderByDescending("createdAt")
        xQuery.getFirstObjectInBackgroundWithBlock {
            (object: PFObject?, error: NSError?) -> Void in
            if error == nil {
                self.X = object!
                completion()
            }
        }
        return true
    }
    

    【讨论】:

    • 成功了!谢谢! -- 顺便说一下,queryForTable() 现在被调用了两次,我假设这是在 viewDidLoad() 中调用它并且它是一个覆盖函数。你知道是否有可能让 queryForTable() 不是一个覆盖函数,以便在打开应用程序时只调用一次?
    • 我不知道,但您可能想在该函数中放置一个断点并每次查看堆栈跟踪以查看它是从哪里调用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多