2017-02-14 132 views
1

使用MapKit的CLGeocoder()。geocodeAddressString()來獲取地址列表的座標和縣信息。只要請求數低於50,一切都可以工作,但超過50就會超出API的限制。由於CLGeocoder調用是異步的,因此我無法輕鬆地調節/控制調用流(例如,一次調用一個地址)。我如何在「異步世界」中正確執行此操作? (免責聲明:我是新來的GCD和異步流量控制的世界,所以我想我可能需要更詳細的迴應)CLGeocoder geocodeAddressString()達到極限

下面是相關代碼:

類屬性的方法是在調用CLGeocoder物業公司地址:

func initializeCoordinates() { 

     let addressForCoords = self.address.getAddress() 
     CLGeocoder().geocodeAddressString(addressForCoords, completionHandler: { (placemarks, error) -> Void in 
      if error != nil { 
       print(error!) 
       return 
      } 
      if placemarks!.count > 0 { 
       let placemark = placemarks?[0] 
       let location = placemark?.location 
       self.coordinates = location?.coordinate 

       if let subAdminArea = placemark?.subAdministrativeArea { 
        self.address.county = subAdminArea 
       } 
      } 
     }) 
    } 

,然後在導入所有屬性的地址從一個文本框(並使得調用initializeCoordinates方法對每個屬性ImportVC部分:

for line in importText { 
     let newAddress = Address() 
     let newHouse = Property() 

     // parse the tab delimited address for each line of input 
     let address = line.components(separatedBy: "\t") 
     if address.count == 4 { 
      newAddress.street = address[0] 
      newAddress.city = address[1] 
      newAddress.state = trimState(state: address[2]) 
      newAddress.zip = address[3] 
      newHouse.address = newAddress 
      newHouse.initializeCoordinates() 
      houses.append(newHouse) 
     } 
    } 

回答

0

我最近遇到了類似的問題。用最後調用自己的遞歸函數替換你的for循環。然而,訣竅是以0.2秒的延遲來調用自己。我使用0.4來保證安全。這將增加用戶的等待時間,但由於API限制,我們沒有選擇。