Да, это возможно. Его называют closure
, или, чаще всего, 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
}
Можно ждать ('NSCondition можно использовать), но это плохая идея, если ваш код вызова находится в основном потоке. Обычной стратегией было бы сделать что-то с изображением внутри обработчика завершения. –
Если вы подождете, это не будет асинхронно. – EmilioPelaez
Дубликат [Возвращаемое значение из обработчика завершения - Swift] (http://stackoverflow.com/questions/31608302/return-value-from-completion-handler-swift/31608684#31608684) –