如何避免viewWillAppear和viewDidAppear之间的延迟

时间:2014-07-07 09:43:52

标签: ios objective-c uiviewcontroller delay

我正在开发一款iPad应用。我有一些带有UIScrollView(scrollView)的UIViewController(viewController),启用了分页。我将一些子UIViewControllers(childVC_1,childVC_2)添加到scrollView。

每个childVC几乎占据整个屏幕,并有5-10个大图像作为子视图。我无法加载所有需要的childVC并将它们存储在内存中,所以我只添加第一个 childVC。我想动态添加下一个childVCs并删除之前的内存,以保持内存清洁。我异步预加载下一个childVC所需的所有图像,并将它们存储在一些NSArray(图像)中。渲染所有图像。

- (UIImage *)renderedImageFromImage:(UIImage *)image
{
    UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0);
    CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
    [image drawInRect:rect];
    UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return renderedImage;
}

当用户开始滚动时,我想添加下一个childVC。我使用预加载的图像初始化childVC。添加子视图控制器非常常见。

    childVC = [[ChildVC alloc] initWithImages:images];
    [self addChildViewController:childVC];
    [self.scrollView addSubview:childVC.view];
    childVC.view.frame = CGRectMake(xCoord, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height);
    [childVC didMoveToParentViewController:self];

我希望它会很快,因为我已经预装了所有需要的图像。我在childVC的viewDidLoad方法中有一些日志,一切都很快。但是viewWillAppear和viewDidAppear之间存在很大的延迟(约半秒)。

我不知道这两种方法之间究竟发生了什么,我不知道我还能做些什么才能让它更快。希望有人有一些想法。

2 个答案:

答案 0 :(得分:1)

我怀疑你的预加载/组合代码是否实际在后台线程中完成。 如果你真的在后台线程中做到这一点,那么0.5秒的延迟太大了。检查它是否在后台线程中实际运行;

[[NSThread mainThread] isEqual:[NSThread currentThread]] 

此外,您的主线程可能会被阻止等待您的后台线程。你在哪里调用第二个代码块?如何将图像数据同步到主线程?如果它实际上是在后台线程中异步完成的,那么执行点将是随机的,并且无法修复。但似乎你在viewWillAppear方法中运行第二个代码块。

答案 1 :(得分:1)

尝试在滚动期间不从视图层次结构中添加或删除视图。如果您可以重复使用滚动视图中已有的视图,请更改内容并重新排列框架。 (例如,如果您向下滚动以获取顶部不再可见的视图,请更改内容并将其移动到当前位置以下。

根据我的经验,addSubviewremoveFromSuperView的通话可以在滚动期间添加小的延迟。