gpt4 book ai didi

ios - 使用后台线程更新界面的模式是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:45:24 24 4
gpt4 key购买 nike

我正在寻找一种通用且优雅的方式来管理界面更新。我知道用户界面代码必须在主线程中运行,所以当我需要一些网络任务计算时,我使用具有这种模式的 GDC:

dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(aQueue, ^() {

//Backgroud code

dispatch_sync(dispatch_get_main_queue(), ^{
//Update the UI
}
}

此代码的问题是我需要始终检查用户是否在我的计算过程中更改了 View ,因此代码如下:

dispatch_sync(dispatch_get_main_queue(), ^{
if (mylabel != nil) && ([mylabel superview] != nil) {
mylabel.text = _result_from_computation_;
}
}

有一些最好的方法吗?

谢谢。

最佳答案

你很好。但是,如果您想阅读更多内容或想要更彻底地解释正在发生的事情...

您应该阅读 Apple 文档 Grand Central Dispatch (GCD) Reference并观看 WWDC 2012 视频,第 712 节 - 使用 block 、GCD 和 XPC 的异步设计模式

如果您使用的是 iOS,则可以忽略 XPC(进程间通信),因为当前操作系统版本(撰写本文时为 6.1)不支持它。

示例:在背景中加载大图像并在完成时设置图像。

@interface MyClass ()
@property (strong) dispatch_block_t task;
@end

@implementation MyClass
- (void)viewDidLoad {
self.task = ^{
// Background Thread, i.e., your task
NSImage *image = [[NSImage alloc] initWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
// Main Thread, setting the loaded image
[view setImage:image];
});
});
}

- (IBAction)cancelTaskButtonClick:(id)sender { // This can be -viewWillDisappear
self.task = nil; // Cancels this enqueued item in default global queue
}

- (IBAction)runTaskButtonClick:(id)sender {
// Main Thread
dispatch_queue_t queue;
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, self.task);
}

为了稍后取消和重新加载界面,您所要做的就是将 dispatch_block_t 变量设置为 nil。

也许更具体地针对您的问题,这段代码示例处理 Reading Data from a Descriptor ,即磁盘或网络。

通常,您会使用 Call-Callback 模式,该模式本质上是获取后台线程、执行任务,并在完成后调用另一个 block 来获取主线程以更新 UI。

希望这对您有所帮助!

关于ios - 使用后台线程更新界面的模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14581559/

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