我有一个scrollView,我在滚动时加载图像,每次只有3页图像(当前上一个下一个)。 它工作得很好,iPad的内存消耗很低(30-40M)。
问题是,当我快速滚动(没有分页启用)时,即使内存不足,我也会收到内存警告。
我发现这是因为一次有多个GCD请求。 可以做些什么来消除这种情况?
我能想到的一个解决方案是,只有在滚动视图减速时才开始加载,但我担心用户体验会不好用(现在看起来很棒),
另一个是,正在使用NSOperation - 这是一个更高的水平,可能会更好?
另一个是使用AutoreleasePool作为线程请求 - 我在几篇文章中看到过。
最佳方法是什么?
这是加载器,在滚动时发生(到相关页面):
[self downloadImageWithURL:userUrl completionBlock:^(BOOL succeeded, NSData *tdata)
{
if (succeeded)
{
//load back
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^
{
UIImage *image=[UIImage imageWithData:tdata scale:1];
if (image)
{
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
[image drawAtPoint:CGPointZero];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
dispatch_async(dispatch_get_main_queue(), ^
{
//LOAD EASY
[UIView transitionWithView:view
duration:0.1f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^
{
view.image=nil;
view.image=image;
}
completion:nil];
});
image=nil;
});
}
}];
}
答案 0 :(得分:0)
我找到了一个很棒的解决方案,对我很有用,我有一个现在正在加载的所有内容的数组,并且我检查了这个数组大小何时导致麻烦。当用户滚动我检查它的大小,当大小超过一定大小时,我只是停止滚动快速滚动。通常在用户滚动太快时会发生这种情况。
CGRect frame=scroller.frame;
frame.origin.y=scroller.contentOffset.y-1.0;
if ([imagesAreLoading count]>10 )//too many requests has being made.
[scroller scrollRectToVisible:frame animated:YES];
希望它可以帮助其他人。