小编Eri*_*ler的帖子

插入~5000行时,Core Data sqlite-wal文件获得MASSIVE(> 7GB)

我正在将数据导入Core Data并发现保存操作很慢.使用iOS模拟器,我看到sqlite-wal文件增长并增长,直到它的大小超过7GB.

我正在导入大约10个字段的大约5000条记录.这不是很多数据.

我插入的每个对象与各种其他对象具有一对一的关系(总共6个关系).所有这些记录合计不到20个字段.没有任何图像或任何二进制数据或任何我能看到的东西可以证明为什么WAL文件的最终大小如此巨大.

我阅读了描述wal文件的sqlite文档,但我不知道这是怎么发生的.源数据不超过50 MB.

我的应用程序是多线程的.我在后台线程中创建一个托管对象上下文,执行导入(创建并保存核心数据对象).

没有在这里编写代码,有没有人遇到过这个?任何人都想过我应该检查什么.代码不是非常简单,所有部分都需要时间在这里输入,所以让我们从一般的想法开始.

我会相信任何能让我朝着正确方向前进的人.

额外信息:

  • 我已经为上下文禁用了撤消管理器,因为我不需要它(我认为默认情况下它在iOS上是零,但我明确地将其设置为nil).
  • 我只在整个循环完成后调用save并且所有托管对象都在ram中(ram上升到100 MB btw).
  • 循环和创建核心数据对象只需要5秒左右.写入awl文件时,保存大约需要3分钟.

sqlite iphone import core-data ios

11
推荐指数
1
解决办法
2450
查看次数

AFNetworking 2.0将NSURLSessionDataTask转换为NSURLSessionDownloadTask不会将所有文件数据写入磁盘

在将NSURLSessionDataTask转换为NSURLSessionDownloadTask时,我们遇到了数据丢失问题.具体来说,对于大于16K的文件,我们将丢失前16K字节(正好是16384字节).写入磁盘的文件短于初始响应的长度....

很长的帖子,感谢阅读和任何建议.

更新2014-09-30 - 最终修复

所以我最近又遇到了同样的行为,并决定深入挖掘.事实证明,Matt T(AFNetworking的作者)发布了一个修改AFURLSessionManager -respondsToSelector方法的提交,如果任何可选委托调用未设置为块,它将返回NO.这里的承诺是(问题#1779):https://github.com/AFNetworking/AFNetworking/commit/6951a26ada965edc6e43cf83a4985b88b0f514d2.

因此,您支持使用可选委托的方式是-setTaskDidReceiveAuthenticationChallengeBlock:使用块INSTEAD 调用方法(为您想要使用的可选委托调用一个方法)来覆盖-URLSession:dataTask:didReceiveResponse:completionHandler:子类中的方法.这样做会产生预期的结果.

建立:

我们正在编写一个从Web服务器下载文件的iOS应用程序.这些文件受php脚本保护,该脚本验证来自iOS客户端的请求.

我们正在使用AFNetworking 2.0+并且正在对发送用户凭据等的API执行初始POST(NSURLSessionDataTask)操作.这是最初的要求:

NSURLSessionDataTask *task = [self POST:API_FULL_SYNC_GETFILE_PATH parameters:body success:^(NSURLSessionDataTask *task, id responseObject){ .. }];

我们有一个自定义类,它继承自AFHTTPSessionManager包含此问题中所有iOS代码的类.

服务器接收此请求并对用户进行身份验证.其中一个POST参数是客户端尝试下载的文件.服务器找到文件并将其吐出.为了简单起见,我已经删除了身份验证和一些缓存控制头,但这里是运行的服务器php脚本:

$file_name = $callparams['FILENAME'];
$requested_file = "$sync_data_dir/$file_name";

@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 'Off');
set_time_limit(0);`

$file_size = filesize($requested_file);
header("Content-Type: application/gzip");
header("Content-Transfer-Encoding: Binary");
header("Content-Length: {$file_size}");
header("Content-Disposition: attachment; filename=\"{$file_name}\"");

$read_bytes = readfile($requested_file);
Run Code Online (Sandbox Code Playgroud)

这些文件总是.gz文件.

回到客户端,接收响应并调用-URLSession:dataTask:didReceiveResponse:completionHandler:方法NSURLSessionDataDelegate.我们检测MIME类型并将任务切换到下载任务:

-(void)URLSession:(NSURLSession *)session
         dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    [super …
Run Code Online (Sandbox Code Playgroud)

network-programming objective-c ios afnetworking-2

5
推荐指数
1
解决办法
1930
查看次数