gpt4 book ai didi

ios - URLSession.shared.dataTask 卡住 UI

转载 作者:行者123 更新时间:2023-11-28 05:43:11 25 4
gpt4 key购买 nike

我正在为 iOS 制作一个 Swift 应用程序,但我提出的请求有问题。

此请求每 3 到 5 秒发出一次,正文是一个 5k 行的 JSON(总共约 130k 个字符),用于刷新 UITableView。问题是每次针对此特定请求使用 .dataTask 时,应用程序都会卡住,然后在发出请求后正常运行。

“卡住”是指我在滚动长 UITableView 时检测到它。即使是一个小的滚动列表也会卡住。

我首先怀疑 UITableView 的更新,但我添加了一个小的“hack”,在滚动时禁用 UITableView 的更新,如下所示:

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
print("started scrolling")
self.currentlyScrolling = true
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
print("stopped scrolling")
self.currentlyScrolling = false
}

它不起作用。

我的问题是:我认为 dataTask 没有在主线程中运行。但我不确定。我怎样才能检查它?另外,我如何确定 dataTask 是异步的?

dataTask 代码如下所示:

let task = URLSession.shared.dataTask(with: req) { data, response, err in
guard let data = data, err == nil else {
// error
return
}

if let resp = try? JSONSerialization.jsonObject(with: data) {
// success
}
}

task.resume()

但是请注意,它只在 JSONSerialization 之前卡住,而不是之后,所以我猜这不是导致卡住的原因。

最佳答案

URLSession.shared.dataTask 在后台线程中运行,您可以移动 JSONSerialization,如果您正在更新 UI,则全部在主线程中移动

let task = URLSession.shared.dataTask(with: req) { data, response, err in {

// HERE YOU ARE IN BACKGROUND THREAD, see print result in debug area

print("You are on \(Thread.isMainThread ? "MAIN" : "BACKGROUND") thread.")

guard let data = data, err == nil else { return }

if let resp = try? JSONSerialization.jsonObject(with: data) {
DispatchQueue.main.async {
print("Now moved to \(Thread.isMainThread ? "MAIN" : "BACKGROUND") thread")

// success, ANY UI UPDATES MUST BE MADE HERE
}
}
}

你的JSON解析应该在后台线程,所以这个解析操作不会阻塞主线程上的其他东西,比如UI。

以下是一个使用在主线程上调用的完成 block 的示例

func myApiTask(with request: URLRequest, completion:@escaping (_ data: Any?) -> Void) {
let task = URLSession.shared.dataTask(with: request) { data, response, error in

var resp: Any?
defer {
DispatchQueue.main.async{ completion(resp) }
}

if data == nil && error == nil {
resp = try? JSONSerialization.jsonObject(with: data!)
} else {
// error handling
}

}
}

用法

myApiTask(with: req) { data in
// you are on main thread
}

关于ios - URLSession.shared.dataTask 卡住 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55878289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com