swiftmkmapitem

Double variable in MKMapItem array


I got a SearchBar that giving the name it print the name searched in a TableView. Before add the key searched I am checking if my Database got the variable. If my database got it I add the searched word in the TableView. My problem is that at the moment matchingItems or response.mapItems got double variable or more and it print a lot of times the same name in the TableView. I have tried a lot of time to fix that but I don't know how do it.

Image of bug > http://i67.tinypic.com/2jfyxdf.png Example of MKMapItem

<MKMapItem: 0x6000003566e0> {
isCurrentLocation = 0;
name = "Arco di Traiano";
placemark = "Arco di Traiano, Via Traiano, 82100 Benevento, Italia @ <+41.13253257,+14.77915406> +/- 0.00m, region CLCircularRegion (identifier:'<+41.13253316,+14.77915406> radius 1414.16', center:<+41.13253316,+14.77915406>, radius:1414.16m)";
timeZone = "Europe/Rome (CEST) offset 7200 (Daylight)";
url = "http://www.comune.benevento.it/bn2_pagine/_mediagallery/pid.php?id=11";
}

The code it this:

var matchingItems: [MKMapItem] = []

extension LocationSearchTable : UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {

        if searchController.searchBar.text == nil || (searchController.searchBar.text?.count)! < 1 {
            self.matchingItems.removeAll()
            self.tableView.reloadData()
        }

        guard let mapView = mapView,
            let searchBarText = searchController.searchBar.text else { return }

        let request = MKLocalSearchRequest()
        request.naturalLanguageQuery = searchBarText
        request.region = mapView.region
        let search = MKLocalSearch(request: request)

        search.start { response, _ in
            guard let response = response else {
                return
            }
            for (index , name) in response.mapItems.enumerated() {

            if (checkIfDatabaseGotThis(key: String(name.name!)) != nil){
                self.matchingItems.append(response.mapItems[index])
                self.tableView.reloadData()
            }

        }
    }
}
}

Solution

  • Updated so the sample deduplicates by name:

    var seenNames = Set<String>()
    for (index , name) in response.mapItems.enumerated() {
        let item = response.mapItems[index]
        if(checkIfDatabaseGotThis(key: String(name.name!)) != nil && !seenNames.contains(item.name)){
            self.matchingItems.append(item)
            seenNames.insert(item.name)
            self.tableView.reloadData()
        }
    }
    

    That should remove all duplicates from your list of items based on the name. It keeps track of all the existing names that you have seen. If the name hasn't been seen before, the item is added to the list. Otherwise it is ignored.