ios5 – AFNetworking NsOperationQueue – 下载数千张图片

ios5 – AFNetworking NsOperationQueue – 下载数千张图片,第1张

概述我正在处理一项任务(仅限iOS5),涉及从服务器下载千张图像.图像属于某些类别,每个类别可以有数百个图像.我需要做的是: – 1)如果应用程序处于活动状态,请确保应用程序在后台下载任何丢失的图像(即使用户正在浏览应用程序中与照片无关的其他某些区域). 2)当用户点击照片类别时,必须将该类别中的图像作为高优先级下载,因为那些是需要立即可见的图像. 仅当图像尚未脱机可用时才会发生上述所有情况.下载后 我正在处理一项任务(仅限iOS5),涉及从服务器下载数千张图像.图像属于某些类别,每个类别可以有数百个图像.我需要做的是: –

1)如果应用程序处于活动状态,请确保应用程序在后台下载任何丢失的图像(即使用户正在浏览应用程序中与照片无关的其他某些区域).

2)当用户点击照片类别时,必须将该类别中的图像作为高优先级下载,因为那些是需要立即可见的图像.

仅当图像尚未脱机可用时才会发生上述所有情况.下载后,图像将从本地存储中使用.

要解决这个问题,我使用的逻辑是: –

1)在AppDelegate.m中,在applicationDIDBecomeActive中,我开始下载任何丢失的图像.为此,我进行了核心数据查询,找出缺少的图像,并开始在具有BACKGROUND优先级的线程中下载它们.像这样: –

dispatch_queue_t imageDownloadQueue = dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_BACKGROUND,0);dispatch_async(imageDownloadQueue,^{    [DataDownloader downloadMissingImages];});dispatch_release(imageDownloadQueue);

downloadMissingImages代码如下所示: –

NSOperationQueue *downloadQueue = [[NSOperationQueue alloc] init];        downloadQueue.maxConcurrentoperationCount = 20;        for(MyImage *img in matches)        {            NSURLRequest *request = [NSURLRequest requestWithURL:img.photoUrl];            AFImageRequestoperation *operation = [AFImageRequestoperation imageRequestoperationWithRequest:request success:^(UIImage *image) {                [MyImage imageFromAPI:image inManagedobjectContext:document.managedobjectContext];                NSLog(@"Successfully downloaded image for %@",img.Title);                  }];            [downloadQueue addOperation:operation];        }

这有效,但它阻止主UI和应用程序崩溃一段时间后.这是我尝试下载大约700张图片的时候.随着更多的图像,它肯定会崩溃.

2)当用户点击某个类别时,我需要先下载这些图像,因为它们必须立即显示给用户.我不知道如何中断missImages调用并告诉它开始在其他人之前下载某些图像.

因此,基本上,我需要在后台下载所有丢失的图像,但如果用户正在浏览照片类别,那么这些图像必须在下载队列中具有高优先级.

我不知道如何有效地工作.有什么想法吗?

崩溃日志看起来像这样

PAPP(36373,0xb065f000) malloc: *** mmap(size=16777216) Failed (error code=12)*** error: can't allocate region*** set a breakpoint in malloc_error_break to deBUGPAPP(36373,0xb065f000) malloc: *** mmap(size=16777216) Failed (error code=12)*** error: can't allocate region*** set a breakpoint in malloc_error_break to deBUGJun 24 11:39:45 MacBook-Pro.local PAPP[36373] <Error>: ImageIO: JPEG    InsufficIEnt memory (case 4)

提前致谢.

解决方法 关于崩溃,我猜你的应用程序因两种选择中的任何一种而被杀死:

>应用程序变得没有响应(因此没有响应iOS标记过程);
>循环中使用的内存太多,创建了超过700个请求 *** 作.

为了澄清实际发生的情况,您应该提供有关崩溃的更多信息(控制台日志).在任何情况下,修复程序将以每个10或20个块的形式加载图像(如果你愿意,你甚至可以逐个1,我没有看到太多问题).

关于第二点,这是怎么回事:

>在主线程中下载更高优先级的图像(当然,通过异步下载,以避免阻止UI);
>在开始下载“离线”图像之前,通过“更高优先级”下载检查图像是否已经同时下载.

为了更好地处理第2点,您可能需要对自定义 *** 作进行排队,而不是AFImageRequestoperation,以便在实际下载之前进行检查.

编辑:

关于以块的形式下载图像,您可以使用调度组对网络 *** 作进行分组:

dispatch_group_t group = dispatch_group_create();<your_core_data_query>for (...) {    dispatch_group_enter(group);        NSURLRequest *request = [NSURLRequest requestWithURL:img.photoUrl];        AFImageRequestoperation *operation = [AFImageRequestoperation imageRequestoperationWithRequest:request success:^(UIImage *image) {            [MyImage imageFromAPI:image inManagedobjectContext:document.managedobjectContext];            NSLog(@"Successfully downloaded image for %@",img.Title);            dispatch_group_leave(group);     //<== NOTICE THIS        }];}dispatch_group_wait(group,disPATCH_TIME_FOREVER);dispatch_release(group);

在此示例中,我使用调度组对多个异步 *** 作进行分组,并等待它们全部执行;当dispatch_group_wait返回时,您可以执行另一轮(查询核心数据,然后调度 *** 作).

关于您的另一个问题(如何检查更高优先级队列是否已下载某个图像),您应该在执行每个AFImageRequestoperation之前执行核心数据查询;一种可能性是派生自己的类并重写start方法来进行检查.

在这两个帐户中,您可以通过一次下载一个图像来简化所有这些的逻辑(即,for(…)循环不在那里;您只需查询下一个图像以下载并下载它;之前下载你检查它是不是已经存在.

我建议走这条更容易的道路.

希望能帮助到你.

总结

以上是内存溢出为你收集整理的ios5 – AFNetworking NsOperationQueue – 下载数千张图片全部内容,希望文章能够帮你解决ios5 – AFNetworking NsOperationQueue – 下载数千张图片所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1103760.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存