Поиск NSCombobox для большого количества массивов - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть два NSCombobox в одном ViewController.Один для страны, а другой для города.У меня есть текстовые файлы с названием страны, которая включает города с соответствующей широтой и долготой.Например: текстовый файл США содержит 17456 списков городов.Я хочу заселить города по названию своей страны.Но выпадающий список зависает при загрузке большого количества городов.Тем более, что при поиске городов в выпадающем списке приложение зависает из-за большого потребления памяти.Мой текстовый файл выглядит так:

214 Северный храмовый кондоминиум, Юта, Солт-Лейк, 40N46'19,111W54'01,1,4265, L

Трейлерный корт A и B номер один, MT, Hill, 48N33'09,109W40'50,1 ,,

Трейлерный корт A и B номер два, MT, Hill, 48N33'00,109W41'00, 1 ,,

Это то, что я пробовал.

let countryList = ["USA","Germany","Canada","Finland"]

var citiesList: [String] = []
var counter = 0
var countryOrCities = ""

@IBOutlet var country: NSComboBox!
@IBOutlet var city: NSComboBox!

override func viewDidLoad() {
        super.viewDidLoad()

        country.usesDataSource = true
        country.dataSource = self

        city.usesDataSource = true
        city.dataSource = self

        country.stringValue = "USA"
        citiesList = readCitiesFromCountry(country: "USA")
    }
func readCitiesFromCountry(country: String) -> [String] {
        var flag = true
        var returnedCitiesList: [String] = []

        if let path = Bundle.main.path(forResource: country, ofType: "txt") {
            guard let streamReader = StreamReader(path: path) else {fatalError()}
            defer {
                streamReader.close()
            }
            while flag {
                if let nextLine = streamReader.nextLine() {
                    returnedCitiesList.append(nextLine)
                } else {
                    flag = false
                }
            }
        } else {
            fatalError()
        }

        return returnedCitiesList
    }

func numberOfItems(in comboBox: NSComboBox) -> Int {
        switch comboBox {
        case country:
            counter = countryList.count
        case city:
            counter = citiesList.count
        default:
            break
        }
        return counter
    }

func comboBox(_ comboBox: NSComboBox, objectValueForItemAt index: Int) -> Any? {
        switch comboBox {
        case country:
            countryOrCities = countryList[index]
        case city:
            countryOrCities = citiesList[index]
        default:
            break
        }
        return countryOrCities
    }

func comboBoxSelectionDidChange(_ notification: Notification) {
        let comboBox = (notification.object as? NSComboBox)!
        if comboBox == country {
            citiesList = readCitiesFromCountry(country: country.stringValue)
            city.reloadData()
        } else {
            print("Value changed by other")
        }
    }

Вместо dropDownSize, чтобы быть конкретным числом, я хочу, чтобы он прочитал все количество городов так,что поиск городов для выбранной страны не ограничен.Класс StreamReader из Считывание файла / URL построчно в Swift

То, что я пытаюсь достичь, выглядит так: https://www.youtube.com/watch?v=QrdA-zbW4_o&feature=youtu.be>

...