如何从 NSURLRequest 获取可变数据

How to get Mutable data from an NSURLRequest

提问人:Tomm P 提问时间:12/5/2018 更新时间:12/5/2018 访问量:193

问:

我正在尝试从 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 对象似乎要优雅得多。

建议不胜感激。

iOS的 迅速 CSV的 nsurl请求 可变

评论

1赞 vadian 12/5/2018
使数据可变不是问题。我建议使用自定义完成处理程序在数据任务关闭外部完成艰苦的工作,或者调用委托并在 中执行工作。stockLoadComplete()
0赞 Tomm P 12/5/2018
感谢您的回复 vadian - 让我认为关闭我的方法就是问题所在。通过将文件处理放在主线程上来修复错误。

答:

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()

        }

    }