当后台任务完成时,如何在 iPhone 应用程序 IOS 程序中获得主 UI 线程的指示?
背景
- 我正在尝试根据 How to add a UIActivityIndicator to a splash screen in a iphone application? 的概念设置加载指示器
- 打算在 AppDelete 中使用“performSelectorInBackground”来加载模型数据
- 因此,我需要在 RootViewController 中以某种方式告知数据何时在后台完成加载,以便它可以 (a) 使用数据更新 tableview 并 (b) 删除任何事件指示器
- 我假设这里的处理方式如下:
- 在 App Delegate 中 didFinishLaunchingWithOptions 将模型数据加载传递到后台
- AppDelegate 加载 RootViewController 并立即设置事件指示器
- 在后台加载数据后,它必须以某种方式向 RootViewController(?这个问题的原因)表明它已经完成
- 第二个问题可能也是当后台任务确实表明它已完成时,RootviewController 如何在尝试禁用事件指示器之前检查 UI 是否已设置(带有事件指示器等)
Best Answer-推荐答案 strong>
您可以使用 -performSelectorOnMainThread:withObject:waitUntilDone: 从后台选择器回调到主线程,如下所示:
- (void)loadModel
{
// Load the model in the background
Model *aModel = /* load from some source */;
[self setModel:aModel];
[self performSelectorOnMainThreadselector(finishedLoadingModel) withObject:nil waitUntilDone:YES];
}
- (void)finishedLoadingModel
{
// Notify your view controller that the model has been loaded
[[self controller] modelLoaded:[self model]];
}
更新:更安全的方法是检查 -finishedLoadingModel 以确保您在主线程上运行:
- (void)finishedLoadingModel
{
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:_cmd withObject:nil waitUntilDone:YES];
}
// Notify your view controller that the model has been loaded
[[self controller] modelLoaded:[self model]];
}
关于iphone - 后台任务完成后如何指示主 UI 线程? (执行SelectorInBackground),我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/8031868/
|