Ios Alamofire)我希望始终处理新请求
(头) 嗨,我正在制作地图应用程序,显示一些信息 用户可以通过触摸移动地图位置,应用程序显示一些信息 当用户触摸完成时,应用程序通过Location从REST API请求信息。这个位置可以从不同的API获取 (正文) 当用户长距离移动地图时,会出现很多请求。这种情况使我的申请速度变慢 所以我想一直提出这个要求 在发生太多请求的情况下,我如何请求更新的信息 这是我的请求代码 我在等待你的帮助 代码)Ios Alamofire)我希望始终处理新请求,ios,alamofire,Ios,Alamofire,(头) 嗨,我正在制作地图应用程序,显示一些信息 用户可以通过触摸移动地图位置,应用程序显示一些信息 当用户触摸完成时,应用程序通过Location从REST API请求信息。这个位置可以从不同的API获取 (正文) 当用户长距离移动地图时,会出现很多请求。这种情况使我的申请速度变慢 所以我想一直提出这个要求 在发生太多请求的情况下,我如何请求更新的信息 这是我的请求代码 我在等待你的帮助 代码) 请求位置 请求信息 实被调用函数 private func doReverseGeocoding(
private func doReverseGeocoding(lat: Double, lng: Double, completionHandler: @escaping (Bool, Address?, String?) -> Void) {
let id = HTTPHeader(name: "X-NCP-APIGW-API-KEY-ID", value:"sb10h4g44n")
let key = HTTPHeader(name: "X-NCP-APIGW-API-KEY", value:"Czs7ZzPQHmgvPg0Y2cfMQEjxNg2WgOUB9LgS2uno")
let headers: HTTPHeaders = HTTPHeaders([id, key])
let urlString = "https://naveropenapi.apigw.ntruss.com/map-reversegeocode/v2/gc?request=coordsToaddr&coords=\(lng),\(lat)&sourcecrs=epsg:4326&output=json&orders=admcode,addr"
guard let url = URL(string: generateURL(string: urlString)) else {
return
}
AF.request(url, method: .get, headers: headers)
.validate()
.responseDecodable(of: NaverRoot.self) { (response) in
guard let root = response.value else {
completionHandler(false, nil, "[NAVER API] 리버스 지오코딩 정보를 불러올 수 없습니다. : \(response)")
self.camera.setAddress(address: Address())
return
}
if root.status.code == 3 {
completionHandler(false, nil, "[NAVER API] 상세 주소 불러오기에 실패했습니다.")
return
}
let region: Geo
let landNumber: Land?
if root.results.count == 2 {
region = root.results[1].region
landNumber = root.results[1].land
self.currentAddress.setAddress(region: region, landNumber: landNumber)
}
else {
region = root.results[0].region
self.currentAddress.setAddress(region: region, landNumber: nil)
}
let address = self.camera.address
if address.cityTown == self.currentAddress.cityTown {
completionHandler(false, nil, nil)
}
else {
self.camera.setAddress(address: self.currentAddress)
completionHandler(true, self.currentAddress, "[NAVER API] 리버스 지오코딩 성공")
}
}
}
private func fetchStores(code locationCode: String,
address: String) {
self.loadingIndicator.isHidden = false
let startTime = CFAbsoluteTimeGetCurrent()
let urlString = "https://openapi.gg.go.kr/RegionMnyFacltStus?KEY=\(KKD_APIKey)&TYPE=json&pSize=\(numberOfData)&REFINE_LOTNO_ADDR=\(address)"
let url = generateURL(string: urlString)
killAllRequest()
AF.request(url)
.validate()
.responseDecodable(of: StoreRoot.self) { (response) in
print("run time: \(CFAbsoluteTimeGetCurrent() - startTime)")
guard let root = response.value else {
print("[GG API]데이터를 불러올수 없습니다.: \(response)")
print("[GG API]실패파라미터: \(address)")
self.loadingIndicator.isHidden = true
return
}
guard let head = root.RegionMnyFacltStus[0].head else {
print("[GO API]요청 해더 디코딩에 실패했습니다.")
return
}
guard let count = head[0].count else {
print("[GG API]불러온 가맹점 카운팅에 실패했습니다.")
return
}
guard let stores = root.RegionMnyFacltStus[1].row else {
print("[GG API]가맹점 정보를 불러오는데 실패했습니다.")
return
}
print("[GG API] \(address)지역에 대한 \(count)개의 가맹점 정보를 불러오는데 성공했습니다.")
// 캐싱을 위한 저장.
self.map.stores = stores
self.loadingIndicator.isHidden = true
// 마커 설정.
self.setMarkers()
}
}
private func findStoreFollowCameraCoord(location: CLLocation) {
doReverseGeocoding(lat: location.coordinate.latitude, lng: location.coordinate.longitude) { (isSuccess, address, message) in
guard let message = message else { return }
print(message)
if isSuccess {
guard let address = address else { return }
let currentCityCode = CityCode.shared.returnCityCode(city: address.city)
self.fetchStores(code: currentCityCode, address: address.cityTown)
}
else {
return
}
}
}