【发布时间】:2020-02-01 02:09:09
【问题描述】:
我有一个包含 18000 行的文本文件,其中包含城市名称。每行都有城市名称、州、纬度、经度等。下面是执行此操作的函数,如果我不实现string.components(separtedBy: ", ") 加载功能非常快,但实现它需要时间,这会使我的 UI 冻结。正确的做法是什么? string.components(separtedBy: ", ") 有那么贵吗?
我分析了应用程序,这条线在整个功能中将 string.components(separtedBy: ", ") 缩短了 2.09 秒中的 1.45 秒。
func readCitiesFromCountry(country: String) -> [String] {
var cityArray: [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() {
cityArray = nextLine.components(separatedBy: ",") // this is the line taking a lot of time, without this function runs pretty fast
if (country == "USA") {
returnedCitiesList.append("\(cityArray[0]) , \(cityArray[1]) , \(cityArray[2])")
} else {
returnedCitiesList.append("\(cityArray[0]) , \(cityArray[1])")
}
//returnedCitiesList.append(nextLine)
} else {
flag = false
}
}
} else {
fatalError()
}
return returnedCitiesList
}
代码中使用的StreamReader可以在这里找到。它有助于逐行读取文件 Read a file/URL line-by-line in Swift
这个问题不是关于如何将字符串拆分为数组 Split a String into an array in Swift? ,而是为什么拆分在给定函数中需要更多时间。
【问题讨论】:
-
什么是
StreamReader? -
将其移至后台线程,以免您的 UI 冻结。
-
@MartinR 我已经编辑了问题并附上了链接。我想,我正在使用你的解决方案。
-
@Willeke,不,不是。我已经编辑了这个问题。请检查!
-
DispatchQueue.global(qos: .userInitiated).async { [weak self] in guard let self = self else { return } //your code for lengthy task
标签: arrays swift string cocoa io