在完成块 Swift 中返回

Posted

技术标签:

【中文标题】在完成块 Swift 中返回【英文标题】:Return in Completion Block Swift 【发布时间】:2017-12-21 13:37:12 【问题描述】:

我正在实施 KolodaView,网址为:https://github.com/Yalantis/Koloda。 viewForCardAt 函数返回一个UIView,我的UIView 将有一个需要下载的图像。问题是函数本身期望返回类型为UIView,但我无法知道setupCard 方法的完成块何时执行完毕,因此我最终可能会返回一个空的FlatCard 而不是在完成块中获得FlatCard。我尝试将return a 添加到完成块,但这是不允许的。如何更改下面的代码以保证仅在执行完成块后才返回卡片。

func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView 

    var a = FlatCard()
    if let listings = all_listings 
        if index < listings.count 
            setupCard(index: index, listings: listings,  (complete, card) in
                if (complete) 
                    a = card
                
            )
            return a
        
     
    return a


func setupCard(index: Int, listings : [Listing], _ completionHandler: @escaping (_ complete: Bool, _ card : FlatCard) -> ()) -> ()

    let curr_card = FlatCard()

    if let main_photo_url = listings[index].pic1url 
        URLSession.shared.dataTask(with: main_photo_url, completionHandler:  (data, response, error) in

            if (error != nil) 
                print(error)
                return
            

            DispatchQueue.main.async 
                curr_card.mainFlatImage = UIImage(data: data!)
            
        )
        completionHandler(true,curr_card)
        return
     else 
        completionHandler(true,curr_card)
        return
    

【问题讨论】:

FlatCard 是什么? 【参考方案1】:

你不能在它准备好之前归还它。

就个人而言,我会更新 FlatCard 以便它可以下载图像本身并在完成后更新它自己的视图。

类似的东西

class FlatView: UIView 

    var imageURL: URL? 
        didSet 
            if let imageURL = newValue 
                 // download image, if success set the image on the imageView
            
        
    

那么你在其他函数中需要做的就是……

func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView 

    var a = FlatCard()
    if let listings = all_listings 
        if index < listings.count 
            a.imageURL = listings[index].pic1url
        
     
    return a

【讨论】:

以上是关于在完成块 Swift 中返回的主要内容,如果未能解决你的问题,请参考以下文章

使用完成块,而不是返回一个变量 - iOS Swift

Swift 异步方法和返回/完成块

如何在swift 5中的完成块内向用户显示警报

Swift - 从完成块中解除视图控制器

Swift(08)- 函数

从 Objective-C 到 Swift 的 Swift 传递块