【问题标题】:How to use completion handler correctly [duplicate]如何正确使用完成处理程序[重复]
【发布时间】:2016-02-02 11:43:05
【问题描述】:

我了解完成处理程序的工作原理,但我对语法有点困惑。下面是一个函数,给定一个用户名,调用一个解析查询来找出相应的 userId。查询在函数返回后结束(所以它返回 nil),这就是我们需要完成处理程序的原因。如何实现?

func getUserIdFromUsername(username: String) -> String {
    var returnValue = String()
    let query = PFQuery(className: "_User")
    query.whereKey("username", equalTo: username)
    query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
        if let objects = objects {
            for object in objects {
                returnValue = object.objectId!
            }
        }
    }
    return returnValue

}

注意:我知道存在类似的示例,但它们要么不快速,要么非常冗长。这是一个包含 Parse 的简短版本。

【问题讨论】:

标签: ios swift asynchronous parse-platform completionhandler


【解决方案1】:

实现方法如下:

func getUserIdFromUsername(username: String, completionHandler: String -> Void) {

    let query = PFQuery(className: "_User")
    query.whereKey("username", equalTo: username)
    query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
        if let objects = objects {
            for object in objects {
                completionHandler(object.objectId!)
            }
        }
    }
}

下面是如何使用它:

getUserIdFromUsername("myUser") { id in
    doSomethingWithId(id)
}

【讨论】:

  • 错误:“预期返回字符串的函数中缺少返回”
  • 已修复,忘记删除函数的返回类型
  • 如果函数为 void 而不是返回字符串,解决方案将如何变化?我假设函数声明应该说 Void -> Void,并且不再需要 completionHandler(object.objectId!)。但是调用函数呢?
  • completionHandler 的类型为Void -> Void,您可以在没有completionHandler() 之类的参数的情况下调用它。该功能的用户必须将其称为doSomethingInParse("paramValue") { doSomethingWhenCompleted() }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
相关资源
最近更新 更多