问题:如何获取子上下文以查看父上下文中保留的更改,以便它们触发我的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.
以下是我目前用于开发当前解决方案的资源:
iDeveloper TV - 适用于Mac,iPhone和iPad更新的核心数据
我有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
我的应用程序显示盒装信件,我希望它能够正确拉伸以填满整个屏幕.我正在创建我的主窗口:
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选项,发现似乎没有任何匹配.
我很难从存储在audio.caf中的iPhone上的线性PCM中提取幅度数据.
我的问题是:
还有一个问题: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) Realm中至少使用了两种主要的集合类型:
关于Results对象的文档中的相关描述说:
结果是从对象查询返回的Realm中的自动更新容器类型.
因为我希望我UITableView回应Realm对象服务器上的任何更改,我真的认为我希望我UITableView的Results对象支持.事实上,我认为我总是希望一个Results对象支持我的UI.这只能通过List文档中对象的描述来加强:
List是Realm中用于定义多对多关系的容器类型.
当然,似乎List是专注于数据建模...所以,作为Realm的新手,只是阅读API,我认为答案是使用Results对象,但教程(步骤5)使用List对象,而RealmExamples示例代码使用Results.
我错过了什么?我应该使用List物体支持我UITableViews吗?如果是这样,原因是什么?
我有一个具有许多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) ios ×4
core-data ×2
iphone ×2
cocoa-touch ×1
core-audio ×1
iphone-5 ×1
objective-c ×1
realm ×1
swift ×1
uitableview ×1