Evet, bunu yapmak mümkündür. Buna closure
veya daha yaygın olarak callback
denir. Bir callback
esasen başka bir işlevde bir argüman olarak kullanabileceğiniz bir işlevdir. Tartışmanın sözdizimi
functionName: (arg0, arg1, arg2, ...) -> ReturnType
ReturnType
genellikle Void
olmasıdır. Senin durumunda, bunu kolaylaştırmak için, içinde bir geri arama ile bir işlevi çağırmak sözdizimi (girintili olduğu
function(arg0, arg1, arg2, ...){(callbackArguments) -> CallbackReturnType in
//code
}
Ve birkaç geri aramaları ile bir işlevi çağırmak sözdizimi
result: (image: UIImage?) -> Void
kullanabilirsiniz fonksiyon fonksiyonunu (işlev döndükten sonra çağrılır kaçarsa))
function(
arg0,
arg1,
arg2,
{(cb1Args) -> CB1Return in /*code*/},
{(cb2Args) -> CB2Return in /*code*/},
{(cb3Args) -> CB3Return in /*code*/}
)
okumak, sen argüman türü önünde @escaping eklemelisiniz
İşlev döndürdükten sonra ve sonuç olarak UIImage?
içeren tek bir geri çağırma kullanmak isteyeceksiniz.
Yani, kod bu
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)
}
}
}
gibi bir şey olabilir Ve onu aramak için, sadece istediğiniz ne
imageFromFile(myPFFile){(image: UIImage?) -> Void in
//use the image that was just retrieved
}
Beklemek mümkündür ('NSCondition kullanılabilir ') ancak çağrı kodunuzun ana iş parçacığı üzerinde olması kötü bir fikirdir. Genel strateji, tamamlama işleyicisindeki görüntü ile bir şeyler yapmak olabilir. –
Eğer beklerseniz, asenkronize olmaz.) - – EmilioPelaez
Yinelenen [tamamlama işleyicisinden dönüş değeri Swift] arasında (http://stackoverflow.com/questions/31608302/return-value-from-completion-handler-swift/31608684#31608684) –