解决这个完成块

Posted

技术标签:

【中文标题】解决这个完成块【英文标题】:Solve this completion Block 【发布时间】:2020-01-05 04:17:35 【问题描述】:

我正在尝试,但我一直收到很多警告。

Xcode 给我警告

无法将类型“()”的返回表达式转换为返回类型“[AirportModel]”

对不起,我是一个初学者...在这次关闭中有点迷失...

我必须返回 AirportModel 的这个向量才能在 swiftUI 的列表中显示,我想使用 DispatchQueue 以避免在搜索时阻塞视图:

func filter (valoreSearhed: String, arrayTosearh: AirportVector, completionBlock: (_ airports: [AirportModel]) -> Void) -> [AirportModel]  
    DispatchQueue.global().async 
        let results  = arrayTosearh.filter  $0.aptICAO.localizedCaseInsensitiveContains(valoreSearhed) 
        completionBlock(results)
    

【问题讨论】:

【参考方案1】:

问题不在于关闭。

问题是你定义了这个filter 方法来返回一个[AirportModel],但它没有。去掉函数声明末尾的-> [AirportModel]。你没有从这个函数返回任何东西。您正在使用完成处理程序将结果传回。


顺便说一句,别忘了把你的关闭也标记为@escaping

【讨论】:

【参考方案2】:

我故意假设它应该返回临时空数组,所以我推荐以下

func filter (valoreSearhed: String, arrayTosearh: AirportVector, completionBlock: @escaping (_ airports: [AirportModel]) -> Void) -> [AirportModel]  
    DispatchQueue.global().async 
        let results  = arrayTosearh.filter  $0.aptICAO.localizedCaseInsensitiveContains(valoreSearhed) 
        completionBlock(results)
    
    return []

【讨论】:

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

我的 animatewithduration,完成块只执行一次

重叠 UIView 动画取消第一个完成块

QQ滑块登陆验证码识别的脚本源码

分布式对象和完成块

如何防止 Swift 3 中的嵌套完成块?

如何等待异步调度的块完成?