UI没有更新,而某些功能需要时间执行?

时间:2014-06-10 18:03:14

标签: ios objective-c function user-interface

我正在进行一些图像处理,并且还显示了加载。问题是加载没有更新。

for (ALAsset *asset in assets) {
  weakSelf.HUD.labelText = [NSString stringWithFormat:@"%d/%d",count,assets.coun
  weakSelf.HUD.progress=(CGFloat)count/assets.count;
  [objDoc setImageProcess:asset];
  count++;
}

这里HUD没有更新它的值。如果我把延迟然后显示出来。这里setImageProcess在处理时需要时间。

2 个答案:

答案 0 :(得分:2)

UI更新发生在iOS和Mac OS的主线程上。如果你有一个在后台线程上运行的耗时的代码,你可以发送消息到主线程来更新UI,它可以很好地工作。

如果您在主线程上运行耗时的代码,则会累积UI更改,并且只有在您的应用返回并访问事件循环时才会呈现给屏幕。

因此,如果你有一个执行大量耗时任务的循环并且在整个循环完成之前没有返回,那么它就不起作用,因为在你返回之前不会发生UI更新。 / p>

您需要重构代码以在迭代之间返回。像这样:

创建实例变量assetCount:

@interface myClass: UIViewController;
{
  NSInteger assetIndex;
}
@end.

然后

-(void) viewDidLoad;
{
  assetIndex = 0;
  [self processAssets];
}

- (void) processAssets;
{
  if (assetIndex >= assets.count)
    return;
  ALAsset *asset = assets[assetIndex];
  weakSelf.HUD.labelText = [NSString stringWithFormat:@"%d/%d",count,assets.coun
  weakSelf.HUD.progress=(CGFloat)count/assets.count;
  [objDoc setImageProcess:asset];
  assetIndex++;
  count++;

  //The following method call queues up a method call 
  //for the next time your app visits the event loop. (plus an optional delay)
  [self performsSelector: processAssets 
    withObject: nil
    afterDelay: 0];
}

上述方法处理1资产,然后将延迟呼叫排队到自身。即使延迟值为0,它仍然可以解决您的问题。这是因为performSelector:withObject:afterDelay:方法总是立即返回,并将方法调用排队,以便下一次通过事件循环。在下一次通过事件循环时,系统会像更新屏幕那样进行内务处理,然后检查这样的待处理呼叫。如果有延迟,它将启动一个计时器。如果没有,它将触发您的方法调用。

您发布的代码中有一个可变计数,可用作数组索引。我添加了一个新的实例变量assetIndex来跟踪当前的数组索引。您的代码也使用术语weakSelf,表明此代码是从块执行的。可能有更简洁的方法来处理这个问题,但您需要提供更多信息。

答案 1 :(得分:0)

对于所有UI更改,您必须在mainthread中调用。验证在主线程中调用当前函数:

BOOL isMainThread = [[NSThread currentThread] isMainThread]