我正在开发一款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之间存在很大的延迟(约半秒)。
我不知道这两种方法之间究竟发生了什么,我不知道我还能做些什么才能让它更快。希望有人有一些想法。
答案 0 :(得分:1)
我怀疑你的预加载/组合代码是否实际在后台线程中完成。 如果你真的在后台线程中做到这一点,那么0.5秒的延迟太大了。检查它是否在后台线程中实际运行;
[[NSThread mainThread] isEqual:[NSThread currentThread]]
此外,您的主线程可能会被阻止等待您的后台线程。你在哪里调用第二个代码块?如何将图像数据同步到主线程?如果它实际上是在后台线程中异步完成的,那么执行点将是随机的,并且无法修复。但似乎你在viewWillAppear
方法中运行第二个代码块。
答案 1 :(得分:1)
尝试在滚动期间不从视图层次结构中添加或删除视图。如果您可以重复使用滚动视图中已有的视图,请更改内容并重新排列框架。 (例如,如果您向下滚动以获取顶部不再可见的视图,请更改内容并将其移动到当前位置以下。
根据我的经验,addSubview
和removeFromSuperView
的通话可以在滚动期间添加小的延迟。