我正在尝试从 URL 检索文本文件,然后以 swift 数据表单处理该文本文件。它类似于 CSV 文件,但使用“|”用于列分隔符,“}”用于行分隔符。
我想删除第一个“行”直到“}”字符(我的行分隔符是“}”,以便我可以循环浏览文件直到它为空。
但是 NSURLRequest 返回一个不可变的 Swift Data 对象。
我想我可以将它复制到可变副本中,但如果我可以说服 NSURLRequest 返回一个可变数据对象,我更喜欢它。这可能吗?
我的 URL 请求如下所示:
func load(url: String) {
debugPrint(#function)
let url = URL(string: url)!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
self.handleClientError(error: error)
return
}
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
self.handleServerError(error: response)
return
}
debugPrint("data got")
self.dataGot(data: data!)
DispatchQueue.main.async {
self.loadingDelegate!.stockLoadComplete()
}
}
task.resume()
}
目前,我正在从整个文件创建一个字符串,并执行一些字符串操作来分割行和列:
let asString = String(data: data, encoding: String.Encoding.utf8)
let rows = asString!.components(separatedBy: "}")
for row in rows {
self.addPriceLine(line: row)
}
这种方法因 malloc 错误而失败(在成功处理几百行之后),因此我怀疑我不知何故走错了路。
有“好的”或推荐的方法吗?对我来说,仅使用 Data 对象似乎更优雅。
感谢您的建议。
最佳答案
好的,我解决了这个问题。
我收到运行时 malloc 错误,这让我认为数据缓冲区或其转换为字符串存在问题。
我想知道闭包中的内存分配是否失败,因此我将 gotData() 处理放到主调度队列中。瞧 - malloc 消失了。
显然,你应该在闭包中做什么是有限制的,而不是在主调度队列中,我想我滥用了这种方法。
:)
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
self.handleClientError(error: error)
return
}
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
self.handleServerError(error: response)
return
}
debugPrint("data got")
DispatchQueue.main.async {
self.dataGot(data: data!)
self.loadingDelegate!.stockLoadComplete()
}
}
关于ios - 如何从 NSURLRequest 获取可变数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53617306/