小编Dav*_*iss的帖子

在iOS 5上实现快速高效的核心数据导入

问题:如何获取子上下文以查看父上下文中保留的更改,以便它们触发我的NSFetchedResultsController来更新UI?

这是设置:

你有一个下载并添加大量XML数据的应用程序(大约200万条记录,每条记录大致与正常段落的文本大小相同).sqlite文件的大小约为500 MB.将此内容添加到Core Data需要时间,但您希望用户能够在数据以递增方式加载到数据存储中时使用该应用程序.用户必须看不到大量数据被移动,因此没有挂起,没有抖动:滚动像黄油一样.尽管如此,该应用程序更有用,添加的数据越多,因此我们不能永远等待将数据添加到Core Data存储中.在代码中这意味着我真的想在导入代码中避免这样的代码:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]];
Run Code Online (Sandbox Code Playgroud)

该应用仅限iOS 5,因此需要支持的最慢设备是iPhone 3GS.

以下是我目前用于开发当前解决方案的资源:

Apple的核心数据编程指南:高效导入数据

  • 使用自动释放池来降低内存
  • 关系成本.导入平面,然后在最后修补关系
  • 不要询问你是否可以帮助它,它会以O(n ^ 2)的方式减慢速度
  • 批量导入:保存,重置,排空和重复
  • 导入时关闭撤消管理器

iDeveloper TV - 核心数据性能

  • 使用3种上下文:Master,Main和Confinement上下文类型

iDeveloper TV - 适用于Mac,iPhone和iPad更新的核心数据

  • 使用performBlock在其他队列上运行保存会使事情变得更快.
  • 加密会减慢速度,如果可以,请将其关闭.

Marcus Zarra在核心数据中导入和显示大型数据集

  • 您可以通过为当前运行循环提供时间来减慢导入速度,因此用户感觉很顺利.
  • 示例代码证明可以执行大型导入并保持UI响应,但不能像使用3个上下文和异步保存到磁盘一样快.

我目前的解决方案

我有3个NSManagedObjectContext实例:

masterManagedObjectContext - 这是具有NSPersistentStoreCoordinator的上下文,负责保存到磁盘.我这样做,所以我的保存可以是异步的,因此非常快.我在发布时创建它,如下所示:

masterManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[masterManagedObjectContext setPersistentStoreCoordinator:coordinator];
Run Code Online (Sandbox Code Playgroud)

mainManagedObjectContext - 这是UI在任何地方使用的上下文.它是masterManagedObjectContext的子代.我像这样创建它:

mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[mainManagedObjectContext setUndoManager:nil];
[mainManagedObjectContext setParentContext:masterManagedObjectContext];
Run Code Online (Sandbox Code Playgroud)

backgroundContext - 此上下文在我的NSOperation子类中创建,该子类负责将XML数据导入Core Data.我在操作的main方法中创建它并将其链接到那里的主上下文.

backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[backgroundContext setUndoManager:nil];
[backgroundContext setParentContext:masterManagedObjectContext];
Run Code Online (Sandbox Code Playgroud)

这实际上非常非常快.只需通过这3个上下文设置,我就可以将导入速度提高10倍以上!老实说,这很难相信.(此基本设计应该是标准Core Data模板的一部分......)

在导入过程中,我保存了两种不同的方式.我在背景上下文中保存的每1000个项目:

BOOL saveSuccess …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchedresultscontroller nsmanagedobjectcontext ios

98
推荐指数
1
解决办法
1万
查看次数

我如何支持更高的iPhone 5屏幕尺寸?

我的应用程序显示盒装信件,我希望它能够正确拉伸以填满整个屏幕.我正在创建我的主窗口:

self.mainWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
Run Code Online (Sandbox Code Playgroud)

但我仍然收到信箱的行为.我需要设置一些其他设置来获取设备上的主屏幕的完整大小吗?

如果可以的话,我试图避免使用任何启动图像.我试过这个:

self.mainWindow.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Run Code Online (Sandbox Code Playgroud)

它似乎没有帮助.我查看了所有Info.plist选项,发现似乎没有任何匹配.

objective-c ios iphone-5

22
推荐指数
1
解决办法
1万
查看次数

从iPhone上的线性PCM中提取幅度数据

我很难从存储在audio.caf中的iPhone上的线性PCM中提取幅度数据.

我的问题是:

  1. 线性PCM将幅度样本存储为16位值.它是否正确?
  2. 振幅如何存储在AudioFileReadPacketData()返回的数据包中?录制单声道线性PCM时,不是每个样本(在一个帧中,在一个数据包中)只是一个SInt16阵列?什么是字节顺序(大端与小端)?
  3. 线性PCM幅度的每一步在物理上意味着什么?
  4. 当在iPhone上记录线性PCM时,中心点0(SInt16)还是32768(UInt16)?最大最小值在物理波形/气压中意味着什么?

还有一个问题:iPhone麦克风无法测量声音/气压波形吗?

我的代码如下:

// get the audio file proxy object for the audio
AudioFileID fileID;
AudioFileOpenURL((CFURLRef)audioURL, kAudioFileReadPermission, kAudioFileCAFType, &fileID);

// get the number of packets of audio data contained in the file
UInt64 totalPacketCount = [self packetCountForAudioFile:fileID];

// get the size of each packet for this audio file
UInt32 maxPacketSizeInBytes = [self packetSizeForAudioFile:fileID];

// setup to extract the audio data
Boolean inUseCache = false;
UInt32 numberOfPacketsToRead = 4410; // 0.1 seconds of data
UInt32 ioNumPackets …
Run Code Online (Sandbox Code Playgroud)

iphone core-audio ios

10
推荐指数
1
解决办法
8913
查看次数

使用Realm,我应该使用List对象或Results对象作为UITableView的数据源吗?

Realm中至少使用了两种主要的集合类型:

  1. 名单
  2. 结果

关于Results对象的文档中的相关描述说:

结果是从对象查询返回的Realm中的自动更新容器类型.

因为我希望我UITableView回应Realm对象服务器上的任何更改,我真的认为我希望我UITableViewResults对象支持.事实上,我认为我总是希望一个Results对象支持我的UI.这只能通过List文档中对象的描述来加强:

List是Realm中用于定义多对多关系的容器类型.

当然,似乎List是专注于数据建模...所以,作为Realm的新手,只是阅读API,我认为答案是使用Results对象,但教程(步骤5)使用List对象,而RealmExamples示例代码使用Results.

我错过了什么?我应该使用List物体支持我UITableViews吗?如果是这样,原因是什么?

realm uitableview ios swift realm-mobile-platform

6
推荐指数
1
解决办法
1171
查看次数

如何使用NSFetchedResultsController设置NSPredicate以过滤指定组中的项目

我有一个具有许多Item实体的Group实体.Item实体可以位于多个组中.我模型的相关部分如下所示:

替代文字

问题

我打电话的时候

[fetchedResultsController performFetch:&error]
Run Code Online (Sandbox Code Playgroud)

我在控制台中收到此错误

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here' ***
Run Code Online (Sandbox Code Playgroud)

我很确定问题出在我如何在这里设置谓词:

[NSPredicate predicateWithFormat:@"groups == %@", self.group];
Run Code Online (Sandbox Code Playgroud)

但我不知道我做错了什么.我已经阅读了NSPredicate文档,我试过这个:

[NSPredicate predicateWithFormat:@"ANY groups IN %@", [NSArray arrayWithObject:self.group]];
[NSPredicate predicateWithFormat:@"ANY groups LIKE %@", self.group];
[NSPredicate predicateWithFormat:@"ANY groups == %@", self.group];
[NSPredicate predicateWithFormat:@"ANY groups IN %@", [NSArray arrayWithObject:self.group]];
[NSPredicate predicateWithFormat:@"groups == %@", self.group];
Run Code Online (Sandbox Code Playgroud)

这些都不起作用.这必须简单,但我无法弄清楚.我只是希望谓词过滤所有项目,以便只返回组成员(通过模型关系)的项目.你怎么做到这一点?

我有一个NSFetchedResultsController,我试图配置为只显示特定组中的项目.我设置NSFetchedResultsController的代码如下所示:

// create the fetch request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

// configure the entity
NSEntityDescription *entity = [NSEntityDescription …
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch core-data

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