cuốn sách gpt4 ai đã làm

ios - NSURLSession dataTaskWithURL 非常 "slow"

In lại Tác giả: Walker 123 更新时间:2023-11-28 21:30:02 38 4
mua khóa gpt4 Nike

我的意思是“慢”,回调类型等待远程服务器超时以有效触发(调用 vimeo 提要,解析它,然后在场景中显示 uiviews)

我大多不明白它是如何工作的。我希望在返回响应后立即从回调中填充我的 View

有下面的代码(rubymotion,但你可能明白了):

session = NSURLSession.sharedSession
url = NSURL.URLWithString(ALBUMS_URL)
downloadTask = session.dataTaskWithURL( url, completionHandler: lambda { |data, response, error|
# 'puts' prints the result in the console, you get it as soon as the response arrives
puts data
# testing with a simple view
v = UIView.alloc.initWithFrame(CGRectMake(0,0,@width/2,200))
v.backgroundColor = UIColor.blackColor
self.view.addSubview v # ==> takes forever to effectively appear on the scene
})

我最终在主线程中设置了以下内容

NSURLSession.sessionWithConfiguration(
NSURLSessionConfiguration.defaultSessionConfiguration,
delegate:nil,
delegateQueue: NSOperationQueue.mainQueue
)

应该使用其他东西来完成此类任务?有没有办法“强制”更新 View ?

câu trả lời hay nhất

您的 UI 更新时间过长的原因不是操作时间过长,而是因为 NSURLSessionDataTask 在后台线程 中完成。您可能知道,您不应该从后台线程更改 UI,只能从主线程更改。

您将整个 URL session 的回调放在主队列中的解决方案“解决”了这个问题,但不是正确的方法,因为您现在是在主队列中进行网络操作,对于可能发生的事情应该尽可能少在后台完成(如网络操作)。

要解决此问题,您需要在后台线程中执行网络操作,然后最后在主线程中调用 UI 更改逻辑。你可以做一个简单的 dispatch_async() 调用来创建一个更新 UI 的 block ,就像这样(抱歉,我不熟悉 RubyMotion,所以我用 Objective-C 写这个):

// in the callback for NSURLSessionDataTask:
NSLog(@"%@", data);

// Dispatch the UI-related logic as a block on the main-thread
dispatch_async(dispatch_get_main_queue(), ^{
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0,0,width/2,200)];
v.backgroundColor = [UIColor blackColor];
[self.view addSubview:v];
});

关于ios - NSURLSession dataTaskWithURL 非常 "slow",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36499740/

38 4 0
Walker 123
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress