所以我有一个来自Parse的PFFile对象,并且我试图创建一个函数来检索该PFFile的UIImage表示并将其返回。就像是:
func imageFromFile(file: PFFile) -> UIImage? {
var image: UIImage?
file.getDataInBackgroundWithBlock() { (data: NSData?, error: NSError?) -> Void in
if error != nil {
image = UIImage(data: data!)
}
}
return image
}
但是,这里的问题很明显。我每次都会得到nil,因为getDataInBackroundWithBlock函数是异步的。有什么方法可以等到检索到UIImage之后再返回image变量?我不知道在这种情况下使用同步getData()是否有效。
是的,可以这样做。它称为a
closure
,或更常见的是a
callback
。A callback
本质上是一个可以在其他函数中用作参数的函数。参数的语法是
functionName: (arg0, arg1, arg2, ...) -> ReturnType
ReturnType
通常是Void
。就您而言,您可以使用
result: (image: UIImage?) -> Void
调用带有一个回调的函数的语法是
function(arg0, arg1, arg2, ...){(callbackArguments) -> CallbackReturnType in
//code
}
并且使用多个回调调用函数的语法是(缩进以便于阅读)
function(
arg0,
arg1,
arg2,
{(cb1Args) -> CB1Return in /*code*/},
{(cb2Args) -> CB2Return in /*code*/},
{(cb3Args) -> CB3Return in /*code*/}
)
如果函数对函数进行转义(在函数返回后调用),则必须在参数类型之前添加@escaping
您将要使用一个单个回调,该回调将在函数返回后被调用并包含UIImage?
为结果。
因此,您的代码可能看起来像这样
func imageFromFile(file: PFFile, result: @escaping (image: UIImage?) -> Void){
var image: UIImage?
file.getDataInBackgroundWithBlock() { (data: NSData?, error: NSError?) -> Void in
//this should be 'error == nil' instead of 'error != nil'. We want
//to make sure that there is no error (error == nil) before creating
//the image
if error == nil {
image = UIImage(data: data!)
result(image: image)
}
else{
//callback nil so the app does not pause infinitely if
//the error != nil
result(image: nil)
}
}
}
调用它,您可以简单地使用
imageFromFile(myPFFile){(image: UIImage?) -> Void in
//use the image that was just retrieved
}
问题内容: 我正在使用nodejs通过Mongoose从Mongodb查询数据。获取数据后,我想对该数据做一些处理,然后再将其响应给客户端。但是我无法获得返回值。在Google上浏览后,我了解到Node.js函数是异步javascript函数(非I / O阻止)。我尝试了这个Tut( 问题答案: 获得未定义值的原因是因为find函数是异步的,并且可以随时完成。在您的情况下,使用后就结束了,因此在访
问题内容: 我想创建一个函数来检查user_id是否已在我的数据库中。 但是,是第三方Firebase提供的API。它定义为return 。 (void)observeSingleEventOfType:(FEventType)eventType withBlock:(void(^)(FDataSnapshot * snapshot))块 错误: 感谢任何帮助。 更新 我正在尝试另一种方式: 不知
问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做
问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做
问题内容: 我正在编写一个函数,该函数采用groupchatID(字符串),并为该群聊返回收件人列表([String])。我正在努力与功能的异步部分。当我运行该函数时,它将正确地将我要查找的用户名数组打印到控制台。虽然,当我调用该函数并尝试打印返回的值时,它始终是一个空数组,因为该函数会在Firebase调用完成之前返回该数组。我正在尝试使用回调,但是我不太了解所有语法。请看一下,让我知道需要更改
更新 我已经读了十几篇关于这个话题的文章,但没有一篇涉及到这个基本问题。我将在本文末尾列出一个参考资料部分。 原始帖子 我对函数的理解是,它返回一个promise。 MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 在我的程序中,我可以编写如下内容: 我