scrollView中的多个GCD请求

时间:2014-05-27 09:52:18

标签: objective-c uiscrollview

我有一个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;
                            });
         }
     }];


}

1 个答案:

答案 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];

希望它可以帮助其他人。