2017-08-12 85 views
0

我有一個循環正在採取一個數組的元素,它是postcodes並將它們在for循環中更改爲緯度,經度,標題和郵編,並創建和追加帶有結果的字典數組。在原始數組中有3個郵政編碼,它顯示了這個打印,但由於某種原因,該循環不僅循環3次,它正在這樣做了很多次,這是給我重複的數據,我已經看過去除重複而且這種方式在某種程度上可以讓我留下3個結果,但有時結果是確定的,其中郵編和標題都是不同的,但在某些情況下,它帶有2個不同郵編的相同標題。for循環創建重複。 iOS,Swift

任何人都可以幫助這一點我在正確的方向嗎?

self.places = self.pCodes 

// Loop start 
for eachAddress in self.places { 
           let geocoder = CLGeocoder() 
           geocoder.geocodeAddressString(eachAddress) { 
            placemarks, error in 
            let placemark = placemarks?.first 
            let lat = placemark?.location?.coordinate.latitude 
            let lon = placemark?.location?.coordinate.longitude 
            let postPcode = eachAddress 
            let locationTitle = self.cNames[self.lt] 
            let latLon = ["Post Code": postPcode, "title": locationTitle, "latitude":lat!, "longitude": lon!] as [String : Any] 

            self.posts.append(latLon) 

           // adding 1 to lt to pick the next title in the array 

            if self.lt < (self.pCodes.count - 1) { 
            self.lt += 1 

            }else { 
             self.lt = (self.pCodes.count - 1) 
          } 


           // removing duplicates 
            var set = Set<String>() 
            let arraySet: [[String : Any]] = self.posts.flatMap { 
             guard let name = $0["Post Code"] as? String else {return nil } 
             return set.insert(name).inserted ? $0 : nil 
            } 


            self.postsFinal = arraySet 
            print("Tony Places \(self.places)") 
            print("Tony: postsFinal \(self.postsFinal)") 
            self.showSightingsOnMap() 
         } 
        } 

這是打印出來的。

託尼的地方[ 「OL8 2TT」, 「PO1 5DS」, 「PO1 5JA」] 託尼:postsFinal [ 「緯度」:53.514649900000002, 「郵編」: 「OL8 2TT」, 「稱號」: 「JDFG VBF」,「經度」:-2.1052824000000001]] Tony Places [「OL8 2TT」,「PO1 5DS」,「PO1 5JA」] Tony:postsFinal [[「緯度」:53.514649900000002,「郵政編碼」 OL8 2TT「,」title「:」JDFG VBF「,」經度「:-2.1052824000000001]] Tony Places [」OL8 2TT「,」PO1 5DS「,」PO1 5JA「] Tony:postsFinal [[」latitude「 53.514649900000002,「郵編」:「OL8 2TT」,「標題」:「JDFG VBF」,「經度」:-2.1052824000000001]] Tony Places [「OL8 2TT」,「PO1 5DS」,「PO1 5JA」] Tony :postsFinal [[「緯度「:53.514649900000002,郵政編碼:」OL8 2TT「,」標題「:」JDFG VBF「,」經度「:-2.1052824000000001],[」緯度「:50.800523599999998,」郵政編碼「:」PO1 5DS「標題「:」QWER QWE「,」經度「:-1.0723248000000001]] Tony Places [」OL8 2TT「,」PO1 5DS「,」PO1 5JA「] Tony:postsFinal [[」緯度「:53.514649900000002, 「:」OL8 2TT「,」標題「:」JDFG VBF「,」經度「:-2.1052824000000001],[」緯度「:50.800523599999998,」郵政編碼「:」PO1 5DS「,」標題「:」QWER QWE「, 「經度」:-1.0723248000000001],[「緯度」:50.802415099999997,「郵編」:「PO1 5JA」,「標題」:「QWER QWE」,「經度」:-1.0726989]] Tony Places [「OL8 2TT」 ,「PO1 5DS」,「PO1 5JA」] Tony:postsFinal [[「緯度」:53.514649900000002,「郵編」:「OL8 2TT」,「標題」:「JDFG VBF」,「經度」:-2.1052824000000001] [「緯度」:50.800523599999998,「郵政編碼」:「PO1 5DS」,「標題」:「QWER QWE」, 「東經」:-1.0723248000000001],[ 「緯度」:50.802415099999997, 「郵編」: 「PO1 5JA」, 「稱號」: 「QWER QWE」, 「東經」:-1.0726989]

+0

您可以發佈pCodes聲明嗎?它是一個NSArray,Array等。 –

+0

@Kris Gellci var pCodes = [String]()pCodes是一個與地點完全相同的郵編數組。我從Firebase數據庫中獲取郵編作爲關鍵字,並將它們放入數組中。我也有var cNames = [String]()這是數據庫的值,這些也放入數組中。所以我基本上有2個數組1的鍵和另一個來自firebase的值,然後將它們與2個其他元素一起添加以創建字典。然後我將字典數組添加到帖子中。 –

+0

你處理異步調用的方式很奇怪。我會使用'dispatch_group()'來代替:https://stackoverflow.com/questions/39465789/swift-how-to-use-dispatch-group-with-multiple-called-web-service – Larme

回答

0

你有此代碼正在進行一些問題。爲了讓你開始,最大的問題是geocodeAddressString。這是一個異步調用,並不保證它被調用的順序。是否正在處理異步調用內部的索引,這是您獲取不匹配對象的原因。

geocodeAddressString完成塊內部的代碼沒有按照您編碼的順序執行。假設您在self.places數組中有5個元素。對於每一個你打電話給geocodeAddressString。

geocodeAddressString(1) 
geocodeAddressString(2) 
geocodeAddressString(3) 
geocodeAddressString(4) 
geocodeAddressString(5) 

其中geocodeAddressString執行完畢塊可能是這樣的順序:

geocodeAddressString(2) 
geocodeAddressString(5) 
geocodeAddressString(1) 
geocodeAddressString(3) 
geocodeAddressString(4) 

這是因爲geocodeAddressString做一些工作,這需要的時間量,可能是網絡電話。它會在有適當的信息後立即返回,這意味着撥打5個電話將使它們以不同的速率返回。把它看作是一個有5名選手的比賽。

+0

這是有道理的,謝謝你的信息,我會看更多。 –