gpt4 book ai didi

iphone - 带有 UIActivityIndi​​cator 的 UIAlertView 显示得太晚/线程问题

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

在我的应用程序中,我有几个地方可以调用 Web 服务并检索 JSON,然后将其解析为对象数组。最耗时的肯定是web服务调用了。我想要的行为如下:

  1. 用户选择感兴趣的行
  2. 在当前 View 上,添加了带有 ActivtiyIndi​​cator subview 的 AlertView
  3. 新 VC 中的数据加载
  4. 出现新 View
  5. AV 指示灯消失

我的 VC 配备了 doLoadData基本上加载每个 VC 显示的数据数组的方法。例如:

AnimalViewController有一个按钮“查看狗”,按下时:


DogViewController *vc = [[DogViewController alloc] init];<br/>[self.navigationController pushViewController:vc animated:YES];<br/>
[vc release];

DogViewController有属性(property)NSArray *dogs和方法doLoadDogs ,这需要一段时间才能发生。

目前我在“查看狗”方法中有:

  1. 创建带有 ActivityIndi​​cator 的 AlertView
  2. 显示它
  3. 创建VC
  4. 插入它
  5. 隐藏 AlertView
  6. 释放并归零

这似乎并不困难,但我还没有找到一个简单的线程实现。

最佳答案

如果您的网络调用/数组创建需要很长时间并且在主线程上进行,那么所有这些基本上会同时发生。当您执行诸如显示警报 View 、推送导航 Controller 等操作时,您真正在做的是安排这些操作在运行循环的下一轮发生。由于您的“View Dogs”方法本质上是阻塞的,直到一切都完成,所以运行循环不会再次执行,直到一切都需要之后。

最好的解决方案是分解出您的网络加载代码,而不是阻塞您的主线程/主事件循环。作为快速修复,您可以使用 GCD 分解出当前“View Dogs”方法的各个部分。例如(显然这需要根据您的实际要求/代码进行更新):

- (void)viewDogs:(id)sender
{
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// create and schedule the alert view
UIAlertView* alert = [[UIAlertView alloc] initWithTitle...]; // your real alert view
dispatch_async(mainQueue, ^{ [alert show]; });
dispatch_async(mainQueue, ^{
DogViewController* vc = [[DogViewController alloc] init];
[[self navigationController] pushViewController:vc animated:YES];
[vc release];
dispatch_async(mainQueue, ^{ [alert dismissWith...]; [alert release]; });
});
}

关于iphone - 带有 UIActivityIndi​​cator 的 UIAlertView 显示得太晚/线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7799237/

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