我需要实现基于用户输入的地址搜索功能.对于地址建议,我使用MKLocalSearchCompleter
.在检索到建议后,我需要根据地址的标题获得地标.为了获得地标,我使用了CLGeocoder
函数geocodeAddressString
.由于这是一个异步函数,我需要做多个请求,每个地址一个接一个地单独调用它太慢了,所以我需要组合这些请求并同时执行它们.withTaskGroup
似乎是完成此操作的完美方法,但问题是,由于某些原因,任务组只是停止,没有任何错误或异常.只有第一个任务完成,该任务将永远挂起.
我试着用多种不同的方式重写相同的东西,但都无济于事.为了让这件事尽可能简单,我创建了一个单独的playground 项目,只是为了让它尽可能地孤立.令我惊讶的是,这个问题仍然存在!以下是操场上的代码:
import CoreLocation
import MapKit
class MapManager: NSObject, MKLocalSearchCompleterDelegate {
let geocoder = CLGeocoder()
private lazy var localSearchCompleter: MKLocalSearchCompleter = {
let completer = MKLocalSearchCompleter()
completer.delegate = self
return completer
}()
func searchAddress(_ query: String) {
localSearchCompleter.queryFragment = query
}
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
Task {
let placemarks = try! await withThrowingTaskGroup(of: [CLPlacemark].self) { group in
var placemarks: [CLPlacemark] = []
print(completer.results.count) // 15
for result in completer.results {
print("Task was added to the group")
group.addTask { try! await self.geocoder.geocodeAddressString(result.title) }
}
for try await placemark in group {
print("Task appended to a list")
placemarks.append(contentsOf: placemark)
}
// This is never called
return placemarks
}
print(placemarks)
}
}
}
let manager = MapManager()
manager.searchAddress("wall street")
当根据查询"Wall Street"搜索地址时,Complete er返回15个补全.我需要向任务组添加15个任务,每个地址一个.然后对每个地址进行地理编码,以获得它们的地标.问题是所有任务都被添加到组中,但只有第一个任务被附加到列表中.以下是控制台输出:
15
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task was added to the group
Task appended to a list
我想知道这是CLGeocode、MKLocalSearchCompleter、Taskgroup的问题,还是我只是做错了什么.这似乎是一件非常简单的事情,它与其他被嘲笑的类型和值完美地工作,然而出于某种原因,位置服务和任务组的组合完全 destruct 了这个项目.
多谢帮忙!