如何对MKLocalPointsInterestRequests使用Swift async/await



对于视障人士的应用程序,我想在视图中显示POI。我使用下面的代码。尽管最低级别(requestNearbyLocations)将信息打印到调试屏幕,但我无法将此数据(locdata)返回到调用方法,也无法返回到视图。

所用代码的主要摘录:

struct ContentView: View {    
var Apple: AppleData = AppleData()

var body: some View {
Text(Apple.text)
.onAppear {
Apple.requestLoc()
}
} 
}

class AppleData {

var text = ""

func requestLoc() -> Void {
Task {
async let mytext = requestNearbyLocations()
text = await mytext
}
}

func requestNearbyLocations() async -> String {
var region = MKCoordinateRegion()
region.center = CLLocationCoordinate2D(latitude: 52.060049, longitude: 4.542196)

var loctext = ""
let request = MKLocalPointsOfInterestRequest(center: region.center, radius: 100.0)
request.pointOfInterestFilter = MKPointOfInterestFilter(excluding: [.restaurant, .cafe])
let search = MKLocalSearch(request: request)

do {
let response = try await search.start()
print(response.mapItems)
for item in response.mapItems {
print( item.name! )
loctext = item.name!
}
}
catch {
print(error)
}
return loctext
}    
}

我错过了什么?

您想要"观察"AppleData,它应该"发布"text中的更改。

因此,声明AppleDataObservableObjecttext@Published:

class AppleData: ObservableObject {
@Published var text = ""
...
}

并且ContentView应该将该对象指定为@ObservedObject:

struct ContentView: View {
@ObservedObject var apple = AppleData()
var body: some View {
Text(apple.text)
.onAppear {
apple.requestLoc()
}
}
}

请参阅管理应用程序中的模型数据。

最新更新