提问人:Tomm P 提问时间:12/5/2018 更新时间:12/5/2018 访问量:193
如何从 NSURLRequest 获取可变数据
How to get Mutable data from an NSURLRequest
问:
我正在尝试从 URL 中检索文本文件,然后在 swift 数据表单中处理该文本文件。它类似于 CSV 文件,但使用“|”作为列分隔符,使用“}”作为行分隔符。
我想删除第一个“行”到“}”字符(我的行分隔符是“}”,这样我就可以循环浏览文件,直到它为空。
但是,NSURLRequest 返回一个不可变的 Swift Data 对象。
我想我可以将其复制到可变副本中,但如果我能说服 NSURLRequest 返回可变 Data 对象,我更喜欢它。这可能吗?
我的 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 对象似乎要优雅得多。
建议不胜感激。
答:
0赞
Tomm P
12/5/2018
#1
好的,所以我解决了这个问题。
我收到一个运行时 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()
}
}
评论
stockLoadComplete()