iOS 下载和解析大型 JSON 响应导致 CFData(存储)泄漏

2024-02-17

用户第一次打开我的应用程序时,我需要下载大量数据。我从服务器以 JSON 形式获取所有这些数据。根据用户的不同,这些 JSON 文件的大小可以从 10kb 到 30mb 不等,而且数量超过 10 个。

当 JSON 的记录不超过 500 条左右时,我这样做没有问题,但就像我说的,有些记录有 10,000 多条记录,大小可达 30mb。

下载较大的 JSON 时,我的应用程序会分配大量内存,直到我最终收到内存警告并且应用程序崩溃。

看来 CFData 必须是我在 didReceiveData 中构建的 NSMutableData。当我下载单个 JSON 时,CFData(存储)会上升,而当我开始解析时,它会停止上升。

在继续下载和解析下一个 JSON 之前,如何清除该数据?

如下所示,内存中有 200mb 的 CFData(存储):

--

Digging into the CFData doesn't reveal much to help me: enter image description here

下面是我创建操作来获取这些不同 JSON 的代码——

- (void)checkForUpdates
{
    if(!_globals)
        _globals = [MySingleton sharedInstance];

    MyAFHTTPClient* client = [MyAFHTTPClient sharedClient];
    NSString* path = [NSString stringWithFormat:@"cache?deviceUID=%@&token=%@",[_globals getMacAddress], [_globals getToken]];
    NSURLRequest* request = [client requestWithMethod:@"GET" path:path parameters:nil];

     _currentEnvironment = [_globals getActiveEnvironment];       

    if(!_currentEnvironment.didDownloadDataValue)
        [self setupAndShowHUDinView:self.view withText:@"Checking for updates..."];

    AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

        for(NSString *str in [JSON valueForKey:@"Views"])
        {
            //for each table i need to update, create a request to
            NSString* path = [NSString stringWithFormat:@"cache/%@/?deviceUID=%@&token=%@", str, @"00000-00000-0000-00001", [_globals getToken]];
            NSURLRequest* request = [client requestWithMethod:@"GET" path:path parameters:nil];
            AFJSONRequestOperation* operation2 = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
            {
                    // even if this is comment this out and I do nothing but download, app crashes
                    //[self updateTable:str withJSON:JSON];
            } failure:nil];

            [operation2 setSuccessCallbackQueue:backgroundQueue];
            [client.operationQueue addOperation:operation2];
            numRequests++;
        }
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

    }];

    [operation start];
}

CFData 是我在内存中的 JSON 响应吗?我试图清除我的 NSURLCache 但没有成功 -

我还研究了一点 JSON 流。这会帮助我减少内存中的对象数量吗?

除此之外,我能想到的唯一其他选择是实现某种分页......但我需要我的用户拥有所有数据

非常感谢任何帮助/建议!谢谢!

--

EDIT

好吧,我决定使用剥离 AFNetworking 并尝试使用本机函数。在这样做的过程中,我仍然得到了相同的 CFData 版本。我在用NSOperation 的子类 https://github.com/DiamondTechIT/iOS-Simultaneous-Async-NSURLConnections/blob/master/LibSyncTest/LibSyncOperation.m我现在正在创建/添加我的操作,如下所示:

 NSOperationQueue *operationQueue;
 operationQueue = [[NSOperationQueue alloc]init];
 [operationQueue setMaxConcurrentOperationCount:1];
 for(NSString *str in [views valueForKey:@"Views"])
 {

     NSString* path = [NSString stringWithFormat:@"%@cache/%@/?deviceUID=%@&token=%@", _globals.baseURL, str, @"00000-00000-0000-00001", [_globals getToken]];

     LibSyncOperation *libSyncOperation = [[LibSyncOperation alloc] initWithURL:path];
     [operationQueue addOperation:libSyncOperation];

 }

我使用原生 JSON 转换函数处理大量数据,没有内存问题。

我只是使用一个标准NSURLConnection下载NSData然后执行以下操作...

NSData *data = [NSURLConnection sendSynchronous...

// use NSDictionary or NSArray here
NSArray *array = [NSJSONSerialization JSONObjectWithData:data ...

Now deal with the objects.

没有泄漏,因为它是本机函数。比第三方框架快得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 下载和解析大型 JSON 响应导致 CFData(存储)泄漏 的相关文章

随机推荐

  • 返回这个|| (0,eval)('这个');

    查看 doT js 源代码 https raw github com olado doT master doT js https raw github com olado doT master doT js 这是做什么的 function
  • json数组:如何创建新的数组元素?

    我的目标是得到一个像这样的 json 数组 var args name test value 1 key test2 value 2 我怎样才能得到下面的代码来构建像上面一样的数组 this dependentProperties arra
  • “read/1”调用后 SWI Prolog 回溯行为

    我在看另一个序言 https stackoverflow com questions 47317413 how to use user input in prolog to search在StackOverflow上提问并遇到这种情况 假设
  • 音隙不起作用

    我已经从其网站下载了phonegap示例 但它没有运行 我找不到原因 请帮助我获得解决方案 当我运行时它显示 无法加载位于 file andriod asset www index html 的网页 找不到所请求的文件 www index
  • 如何将SIRI集成到iPhone应用程序中? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发一个 iPad 应用程序
  • 如何在 jQuery Ajax 成功回调中处理我的 JSON 数据?

    如果我有一个ajax调用 ajax url url dataType json data data success function json data What s the efficient way to extract the JSO
  • Babel:ES6 中的函数参数类型

    如果我编写以下代码并将其转译为通天塔 6 5 0 它工作正常 function foo first string second number code here string and number刚刚从转译的 ES5 代码中删除 如果我使用
  • C#、F#、IronPython 和 IronRuby 的集成

    有人告诉我 由 C 和 F 源代码生成的程序集文件是可以互操作的 因为它们被编译成 NET 程序集 Q1 这是否意味着 C 可以像调用 C 函数一样调用 F 函数 Q2 IronPython 和 IronRuby 怎么样 我没有看到来自 I
  • 一个或多个数组的加权洗牌?

    使用嵌套数组中的权重对一个或多个数组进行混洗的好算法是什么 Example array array array name gt John rank gt 3 array name gt Bob rank gt 1 array name gt
  • 判断 __getattr__ 是方法还是属性调用

    有什么方法可以使用 getattr 确定方法和属性调用之间的区别吗 I e in class Bar object def getattr self name if THIS IS A METHOD CALL Handle method c
  • 如何在 Google AppEngine 平台上访问 Fauxton?

    我正在 Google App Engine 上创建一个离线优先的应用程序 其中 PouchDB 作为我的本地数据库 CouchDB 作为我的远程数据库 我已在 Google AppEngine 上启用了 CouchDB 并尝试访问以下 UR
  • 今天小部件在应用程序更新后没有响应

    我今天的小部件有一个奇怪的案例 我的应用程序有一个小部件来向用户显示一些信息 小部件上有一些按钮 用户可以点击按钮来获取不同的信息 奇怪的是 我正在开发我的应用程序的新版本 我需要测试一下 当我在旧版本上安装新的临时版本应用程序时 我的小部
  • Python f.write() 不接受更多参数

    我有这样的Python代码 f open nv csv a a 10 3 b 3 12 c 3 13 f write a b c 这将输出返回为 f write a b c TypeError function takes exactly
  • 如何在 PHP 中将字符串转换为数字?

    我想转换这些类型的值 3 2 34 0 234343 等到一个数字 在 JavaScript 中我们可以使用Number 但是PHP中有类似的方法吗 Input Output 2 2 2 34 2 34 0 3454545 0 345454
  • 如何使用React Router将数据从一个页面传递到另一个页面

    请我需要有关react router dom的帮助 我是这个库的新手 似乎可以找到任何解决方案 我从 api 调用中得到三个结果 其中我映射数据以将其呈现在 UI 上 现在我需要的是 如果我单击此列表之一上的一行 我希望它带我到屏幕仅显示我
  • Calendar.WEEK_OF_MONTH 在两个不同的设备上给出不同的结果

    我有两台设备 HTC Android 2 3 5 和 Samsung Android 2 3 6 现在我面临的问题是 我需要日期是一个月中的第几周 所以我编写了这段代码并安装在两部手机上 并将系统日期设置为 2013年1月27日 Calen
  • 无法使用runtime.exec重新启动设备

    由于某种原因 我无法使用 Runtime getRuntime exec system bin reboot 重新启动 Android 设备 我已经在 3 台设备上尝试了以下代码 但没有成功 一个是从 rowboat android 源代码
  • 如何使用触控板在 Java AWT ScrollPane 中进行水平鼠标滚轮滚动

    与许多现代鼠标和触控板一样 我的笔记本电脑支持垂直和水平滚动 一旦你习惯了 它就会让人上瘾 我只是希望我的 Java 应用程序支持通过触控板 鼠标滚轮进行水平滚动 但在我搜索的所有地方似乎这在 Java 中是不可能的 我真的希望有人告诉我我
  • 使用内存中查询实现自定义 QueryProvider

    我正在尝试创建一个包装器可查询库 https github com re motion Relinq blob develop Core QueryableBase cs and INh查询提供者 https github com nhib
  • iOS 下载和解析大型 JSON 响应导致 CFData(存储)泄漏

    用户第一次打开我的应用程序时 我需要下载大量数据 我从服务器以 JSON 形式获取所有这些数据 根据用户的不同 这些 JSON 文件的大小可以从 10kb 到 30mb 不等 而且数量超过 10 个 当 JSON 的记录不超过 500 条左