gpt4 book ai didi

swift - 从异步完成处理程序返回的 RXSwift 平面图

转载 作者:行者123 更新时间:2023-11-28 09:53:11 25 4
gpt4 key购买 nike

我正在尝试创建一个 searchBar,它通过带有请求的 MKLocalSearch 搜索地址并使用 RXSwift 并绑定(bind)到 RXCocoa

到目前为止,我已经完成了以下工作1.过滤和去抖以避免过多的请求:

let searchRes = searchBar.rx.text
.orEmpty
.filter { query in
return query.characters.count > 4
}
.debounce(1, scheduler: MainScheduler.instance)
  1. 生成的字符串查询被映射:ed 以创建 MKLocationSearch,然后 flatMapp:ed 以返回一个 MKMapItems 数组,以便能够将该数组绑定(bind)到 tableView 的项目:

    searchRes.map{query -> MKLocalSearch in
    let request = MKLocalSearchRequest()
    request.naturalLanguageQuery = query
    request.region = self.mapView.region
    return MKLocalSearch(request: request)
    }.flatMapLatest{search -> Observable<[MKMapItem]> in
    search.start(completionHandler:{(response, error) in
    let items: Variable<[MKMapItem]> = Variable([])
    if let resp = response {
    //need to return the result form this
    // i.e. items.value = response.mapItems
    }
    //can not return from here since the request is async
    }
    }.bindTo //continue to bind to tableview

如何使用 RXSwift 完成此操作,我找不到任何相关示例

最佳答案

您必须使用异步请求创建一个 Observable。您可以定义以下方法来执行此操作:

func mapItems(for searchRequest: MKLocalSearch) -> Observable<[MKMapItem]> {
return Observable.create { observer in
searchRequest.start(completionHandler: { (response, error) in
if let error = error {
observer.onError(error)
} else {
let items = response?.mapItems ?? []
observer.onNext(items)
observer.onCompleted()
}
})

return Disposables.create {
searchRequest.cancel()
}
}
}

然后你可以使用 flatMapLatest 方法:

searchRes
.map { query -> MKLocalSearch in
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = query
request.region = self.mapView.region
return MKLocalSearch(request: request)
}
.flatMapLatest{ [unowned self] search -> Observable<[MKMapItem]> in
self.mapItems(for: search)
}
.bindTo(....

关于swift - 从异步完成处理程序返回的 RXSwift 平面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42718537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com