2017-08-12 7 views
0

私は、ポストコードであり、forループで緯度、経度、タイトル、および郵便番号に変更する配列の要素を取って、その結果で辞書の配列を作成して追加するループを持っています。元の配列には3つのポストコードがありますが、これは印刷されていますが、何らかの理由でループが3回繰り返されているだけでなく、重複データを与えているかなりの回数です。これは何らかの形で3つの結果を残して動作しますが、郵便番号とタイトルがすべて異なる場合がありますが、場合によっては2つの異なる郵便番号で同じタイトルが返される場合もあります。重複を作成するループです。 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 [["latitude":53.514649900000002、 "Post Code": " 「OL8 2TT」、「PO1 5DS」、「PO1 5JA」] Tony:postsFinal [["latitude": "OL8 2TT"、 "タイトル": "JDFG VBF"、 "経度":-2.1052824000000001] 「OL8 2TT」、「PO1 5DS」、「PO1 5JA」] Tony Places ["OL8 2TT"、 "PO8] :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 [["latitude":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 [["latitude":53.514649900000002、 "Post Code": "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、配列などです –

+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

これは意味があります、私はこれ以上見るつもりの情報ありがとうございます。 –

関連する問題