Swift 在NSCOMBOX中搜索大量阵列

Swift 在NSCOMBOX中搜索大量阵列,swift,cocoa,nscombobox,Swift,Cocoa,Nscombobox,我在同一个ViewController中有两个NSCombobox。一个是乡村,另一个是城市。我有国家名称的文本文件,其中包括具有各自纬度和经度的城市。例如:美国文本文件包含17456个城市列表。我想用他们的国家名称来填充城市。但combobox在加载大量城市时会冻结。特别是,当在combobox中搜索城市时,应用程序由于占用大量内存而冻结。 我的文本文件如下所示: 214北神庙公寓,犹他州盐湖城,40N46'19111W54'01,14265,L A和B拖车场一号,山地,48N33'09109

我在同一个ViewController中有两个NSCombobox。一个是乡村,另一个是城市。我有国家名称的文本文件,其中包括具有各自纬度和经度的城市。例如:美国文本文件包含17456个城市列表。我想用他们的国家名称来填充城市。但combobox在加载大量城市时会冻结。特别是,当在combobox中搜索城市时,应用程序由于占用大量内存而冻结。 我的文本文件如下所示:

214北神庙公寓,犹他州盐湖城,40N46'19111W54'01,14265,L

A和B拖车场一号,山地,48N33'09109W40'50,1,,

48N33'00109W41'00,1,,

这就是我尝试过的

let countryList=[“美国”、“德国”、“加拿大”、“芬兰”]
var citiesList:[字符串]=[]
变量计数器=0
var countryOrCities=“”
@IBVAR国家/地区:NSComboBox!
@IBVAR城市:NSComboBox!
重写func viewDidLoad(){
super.viewDidLoad()
country.usesDataSource=true
country.dataSource=self
city.usesDataSource=true
city.dataSource=self
country.stringValue=“美国”
citiesList=readCitiesFromCountry(国家:“美国”)
}
func readCitiesFromCountry(国家/地区:字符串)->[字符串]{
var flag=true
var returnedCitiesList:[字符串]=[]
如果let path=Bundle.main.path(forResource:country,of type:“txt”){
guard let streamReader=streamReader(路径:path)else{fatalError()}
推迟{
streamReader.close()
}
一面旗帜{
如果让nextLine=streamReader.nextLine(){
returnedCitiesList.append(下一行)
}否则{
flag=false
}
}
}否则{
法塔莱罗()
}
returnedCitiesList
}
func numberOfItems(在组合框中:NSComboBox)->Int{
开关组合框{
案例国家:
计数器=countryList.count
案例城市:
counter=citiesList.count
违约:
打破
}
返回计数器
}
func组合框(comboBox:NSComboBox,objectValueForItemAt index:Int)->有吗?{
开关组合框{
案例国家:
countryOrCities=countryList[索引]
案例城市:
countryOrCities=城市列表[索引]
违约:
打破
}
返乡
}
func comboBoxSelectionDidChange(u通知:通知){
让comboBox=(notification.object为?NSComboBox)!
如果组合框==国家/地区{
citiesList=readCitiesFromCountry(国家:country.stringValue)
city.reloadData()
}否则{
打印(“由其他方更改的值”)
}
}
我希望它能够读取所有城市的数量,而不是将其缩小为特定的数字 搜索所选国家/地区的城市不受限制。 StreamReader类来自

我正在努力实现的目标是这样的
>

txt是非常非结构化的数据,我建议将其存储为plist或具有预填充的数据库文件。不要为每个城市调用
readCountry
,而是在国家发生变化时调用
readCountry
。@Willeke请指出您在代码中的具体含义?我没有完全理解您所说的。请为城市列表创建一个数组属性,在选择新国家/地区时清除并重新加载该属性。
selectionDidChange
在弹出列表中的选择更改(箭头键)时调用。改用动作。