Ios 如何正确使用完成处理程序

Ios 如何正确使用完成处理程序,ios,swift,asynchronous,parse-platform,completionhandler,Ios,Swift,Asynchronous,Parse Platform,Completionhandler,我理解完成处理程序是如何工作的,但我对语法有点困惑。下面是一个函数,在给定用户名的情况下,该函数调用解析查询以查找相应的userId。查询在函数返回后结束(因此返回nil),这就是我们需要完成处理程序的原因。我如何实现它 func getUserIdFromUsername(username: String) -> String { var returnValue = String() let query = PFQuery(className: "_User")

我理解完成处理程序是如何工作的,但我对语法有点困惑。下面是一个函数,在给定用户名的情况下,该函数调用解析查询以查找相应的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

}

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

以下是如何实现它:

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

以下是如何实现它:

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,并且不再需要completionHandler(object.objectId!)。但是调用函数呢?
completionHandler
的类型是
Void->Void
,您可以不使用类似于
completionHandler()的参数来调用它。该函数的用户将不得不调用它,类似于
doSomethingInParse(“paramValue”){doSomethingWhenCompleted()}
error:“预期返回字符串的函数中缺少返回”修复,忘记删除函数的返回类型如果函数为空而不是返回字符串,解决方案会如何更改?我假设函数声明应该是Void->Void,并且不再需要completionHandler(object.objectId!)。但是调用函数呢?
completionHandler
的类型是
Void->Void
,您可以不使用类似于
completionHandler()的参数来调用它。该函数的用户必须调用类似于
doSomethingInParse(“paramValue”){doSomethingWhenCompleted()}
的函数。看起来可能的重复是关于JavaScript中的异步操作,不迅速。@twernt My bad:)以下是一些其他示例:这些问题几乎有数百个——几乎都是语言不可知的。上面提到的这篇文章很好地解释了异步和同步的含义,值得一读。JavaScript利用了Promise,Swift也将其作为第三方库。看起来可能的重复是关于JavaScript中的异步操作,而不是Swift。@twernt My bad:)以下是一些其他示例:几乎有数百个这样的问题——几乎都与语言无关。上面提到的这篇文章很好地解释了异步和同步的含义,值得一读。JavaScript利用Promise,Swift也将其作为第三方库。