大佬教程收集整理的这篇文章主要介绍了ios – 网络完成块,递归和ARC保留周期,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
关于上下文的一些背景信息:
>假设您要从在线服务下载数据
>你想异步这样做
>你想一次下载一个,然后在完成前一个下载后再做一个下载.
一种巧妙的方法是使用递归.
您可以提出的常见实现的问题是网络完成块和自身之间的保留周期.这可以使用weakSelf参考指针来解决.
但是,保留递归调用的周期呢?
我们已经实现了一个递归堆栈,自我指向下载管理类,如下所示:
-(void)startNetworkDownloadForObjectATindex:(int) anIndex { __typeof__(self) __weak weakSelf = self; NSURL *urlForObjectATindex = [someClass URLforIndex:anIndex]; [self.downloadManager getresourceAtURL:urlForObjectATindex success:^(AFhttprequestOperation *operation,id responSEObject) { if (indexOfObjectToDownload < weakself.@R_553_10586@lnumberOfObjectsToDownload) [weakSelf startNetworkDownloadForObjectATindex:indexOfObjectToDownload+1]; else [weakSelf startDOwnloadTimer]; } failure:^(AFhttprequestOperation *operation,NSError *error) { // response code is in operation.response.statusCode [weakSelf handleNetworkError:error]; }]; } -(void)handleNetworkError:error { // Do some error handling [self startNetworkDownloadForObjectATindex:self.lastunsentObjecTindex]; } -(void)startDownloadTimer { if (self.syncENGIneTimer) [self.syncENGIneTimer invalidate]; self.syncENGIneTimer = [NSTimer scheduledTimerWithTimeInterval:kSynctimeInterval target:self SELEctor:@SELEctor(restartNetworkDownload) userInfo:nil repeats:NO]; } -(void)restartNetworkDownload { // do some fancy calculations / etc to manage your download int anIndex = theResultOfYourCalculation; [self startNetworkDownloadForObjectATindex:anIndex]; }
好的,这是一个可能的递归调用几个网络下载的例子(例如获得100个闪烁的图片),并尝试在1小时后获得新的网络.
请原谅任何编码错别字.
我们在ARC下为iOS 5.0以上的iOS设备运行此功能
当使用self.downloadManager保持对成功和失败完成块的引用时,我们显然通过使用weakSelf引用指针打破了第一级保留周期.这一切都很好,在乐器中也很顺利.
现在,在查看instruments中的分配时,我们会启动下载操作以进行多次下载.
仪器没有泄漏.
但是当重新保存堆时,你可以看到它慢慢增长.
检查分配并查看调用堆栈,看起来块看起来像是通过使用startDownloadTimer来保持对self的引用
任何可能的原因和解决方案的解释将不胜感激:)
尝试这个问题的解决方案:Weak Reference to NSTimer Target To Prevent Retain Cycle
或者使用dispatch_after代替计时器.
以上是大佬教程为你收集整理的ios – 网络完成块,递归和ARC保留周期全部内容,希望文章能够帮你解决ios – 网络完成块,递归和ARC保留周期所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。