iOS 使用AFNetworking 报错“iOS 28: No space left on device”

文章讲述了在iOS应用中,用户在登录时短时间内大量下载图片导致的下载失败问题。通过使用GCD的semaphore限制并发量解决了下载失败的问题。另外,发现由于非单例的AFHTTPSessionManager导致内存溢出,修正为单例模式后,即使高并发下载也不会引发问题。
摘要由CSDN通过智能技术生成

场景:

登陆时候,用户在极短的时间下载很多的图片资源,并且下载是一个异步的,对接口的请求量没有做并发量的限制

问题一:

在下载的过程中,直接显示下载失败,并且后续所有资源都下载失败,解决办法,通过GCD的semaphore,控制并发量

//type 大于等于0,设置此次for 循环里面的最大并发量
dispatch_semaphore_t semaphore_t = dispatch_semaphore_create(type);

//注意点  for 循环必须在移步线程内
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for (int i = 0; i < 1000; i++){
            dispatch_semaphore_wait(semaphore_t, DISPATCH_TIME_FOREVER);
            //模拟耗时异步操作
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                 dispatch_semaphore_signal(semaphore_t);
            });
        }
    }

问题二:

就算我把并发量调到很低,依然下载资源失败,并报错“iOS 28: No space left on device”

一看发现是内存不足,而且是AF报的,说明af 的内存被干爆了,但是此时我的并发量已经很小了

通过一番查找发现

//最后发现问题就在这儿,发现af的这个方法并不是单例方法,多次调用次方法,会导致内存溢出崩溃
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

//解决方法,自己写成单例
AFHTTPSessionManager *manger = [NetWork sharedNetWorkManager].manager;

//自己写一个单例
- (AFHTTPSessionManager *)manager
{
    if(!_manager)
    {
        _manager = [AFHTTPSessionManager manager];
        _manager.responseSerializer = [AFJSONResponseSerializer serializer];
        _manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/json", @"text/javascript",@"text/plain", nil];
        [_manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
        _manager.requestSerializer.timeoutInterval = 18.f;
        _manager.operationQueue.maxConcurrentOperationCount = 20;
        [_manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
    }
    return _manager;
}

通过这番操作之后,我就算把并发量改到两百或者更多,也不会出现这个问题,所以大家在使用af的时候,如果你的接口并发量特别高的时候,可以从这两个方面去处理,不然很有可能出现“No space left on device”的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值