即使使用调度,iOS也会延迟
Posted
技术标签:
【中文标题】即使使用调度,iOS也会延迟【英文标题】:iOS Delay even when using dispatch 【发布时间】:2013-05-14 20:13:04 【问题描述】:我有一个壁纸应用,在主视图上有一个分页滚动视图。滚动视图的每一页显示 9 张图像。 滚动视图时,我正在加载接下来的 10 页图像,并将之前加载的 10 页 uiimages 设置为 nil 以防止出现内存警告。
问题是当视图滚动时,滚动视图的以下方法被调用,即使我已将加载新图像的块代码放在 dispatch_async 中,视图滚动前也有几秒钟的延迟。 当我用调度的东西注释掉整个代码部分时,没有延迟。
如果有人知道为什么会发生这种情况。请告诉我。
非常感谢大家
- (void)scrollViewDidScroll:(UIScrollView *)scrollV
float fractionalPage = scrollView.contentOffset.x / self.view.frame.size.width;
if (curPageNum != lround(fractionalPage))
curPageNum = lround(fractionalPage);
//display the page number
pageNumLabel.text = [NSString stringWithFormat:@"%d",curPageNum+1];
pageNumLabel.alpha = 1.0;
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(dismissPageNum) userInfo:nil repeats:NO];
//loading more pages with 9 image in each
lastLoadedPageNum = MIN(lastLoadedPageNum + 10, numPages - 1);
dispatch_queue_t getImages = dispatch_queue_create("Getting Images", nil);
dispatch_async(getImages, ^
for (int i = curPageNum + 4 ; i <= lastLoadedPageNum ; i++)
int numPicsPerPage = 9;
if (picsNames.count%9 && i == numPages-1)
numPicsPerPage = picsNames.count%9;
for (int j = 0 ; j < numPicsPerPage ; j++)
UIImage *image = [brain imageWith:[picsNames objectAtIndex:(i*9) + j]];
dispatch_async(dispatch_get_main_queue(), ^
//loading the image to imageview
UIImageView *imageView = (UIImageView *)[scrollView viewWithTag:IMAGE_VIEWS_TAG + (i*9) + j];
imageView.image = image;
);
);
//setting old imageview images to nil to release memory
int oldFirstLoadedPageNum = firtLoadedPageNum;
firtLoadedPageNum = MAX(curPageNum - 4, 0);
for (int i = oldFirstLoadedPageNum ; i < firtLoadedPageNum ; i++)
int numPicsPerPage = 9;
if (picsNames.count%9 && i == numPages-1)
numPicsPerPage = picsNames.count%9;
for (int j = 0 ; j < numPicsPerPage ; j++)
UIImageView *imageView = (UIImageView *)[scrollView viewWithTag:IMAGE_VIEWS_TAG + (i*9) + j];
imageView.image = nil;
[((UIActivityIndicatorView *)[imageView viewWithTag:ACTIVITY_INDICATOR_TAG]) startAnimating];
脑法imageWith:
-(UIImage *)imageWith:(NSString *)imageName
NSString *imagePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:imageName];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
if (!image && [self connected])
image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", picsURL, imageName]]]];
if (image)
[UIImagePNGRepresentation(image) writeToFile:imagePath atomically:YES];
return image;
【问题讨论】:
[brain imageWith
方法是什么?
我已经添加了 imageWith 方法
您是否尝试过使用dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_BACKGROUND,0)
而不是dispatch_queue_create("Getting Images", nil)
?
谢谢。那完全奏效了!但现在我收到了可能可以解决的内存警告。
能否告诉我为什么 dispatch_get_global_queue 有效而不是 dispatch_queue_create 有效?
【参考方案1】:
很明显,您的代码正在循环导致延迟。我认为由于调度是在 for 循环内,它仅在经过一定的迭代后才会被调用,因此在这里使用多线程并没有真正的好处。
【讨论】:
主调度在 for 循环之外。并且延迟是由于下载过程而不是显示过程造成的【参考方案2】:很可能是您在嵌套 for 循环块之后的逻辑导致了延迟。将其移到单独的方法中并在单独的线程中运行。
【讨论】:
即使我注释掉该部分,我仍然有延迟 你的块的结尾是在一个 for 循环内 - 你的意思是让这个 for 循环在 dispatch_async 内吗? 没有。在我得到每个图像后的 for 循环中,我将它分配给主队列中的 imageview【参考方案3】:按照 Mike Pollard 的建议,我使用了
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0)
而不是
dispatch_queue_create("Getting Images", nil)
它解决了这个问题。
谢谢大家。
【讨论】:
以上是关于即使使用调度,iOS也会延迟的主要内容,如果未能解决你的问题,请参考以下文章