Двойная переменная в массиве MKMapItem - PullRequest
0 голосов
/ 12 июня 2018

Я получил SearchBar, который дает имя, которое печатает имя, найденное в TableView.Перед добавлением искомого ключа я проверяю, получила ли моя База данных переменную.Если моя база данных получила его, я добавляю искомое слово в TableView.Моя проблема заключается в том, что на данный момент matchItems или response.mapItems получили двойную переменную или более, и она много раз печатает одно и то же имя в TableView.Я много времени пытался это исправить, но я не знаю, как это сделать.

Изображение ошибки> http://i67.tinypic.com/2jfyxdf.png Пример 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";
}

Код это так:

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()
            }

        }
    }
}
}

1 Ответ

0 голосов
/ 12 июня 2018

Обновлено, так что образец дедуплицирует по имени:

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()
    }
}

Это должно удалить все дубликаты из вашего списка элементов на основе имени.Он отслеживает все существующие имена, которые вы видели.Если имя раньше не было видно, элемент добавляется в список.В противном случае оно игнорируется.

...