我在我的一个项目中使用了 Realm.io,我已经在几个 iOS 项目中使用过它,但这是我第一个使用它的 Objective C 桌面应用程序,所以这个问题是基于 OS X 的使用情况。在继续之前,我认为还值得一提的是测试机器正在运行 El Capitan,所以我知道这是测试版软件。
Realm 作为 CocoaPod 加载,一切正常,我可以运行查询等,启动没有问题或其他任何东西让我觉得我可能没有正确关闭我的电话?
我的对象有两种主要的不同类型,一种用于保存“组”,另一种用于保存实际的“对象”。该应用程序是一个照片上传器,因此它会读取 Apple 的照片应用程序,索引所有媒体对象和组,然后上传它们。
在第一次运行时,或者如果我完全删除了领域,所以我们从头开始,一切都会飞快地进行。在下一次运行中,我的查询似乎运行得更慢,数据库首先从 25Mb 变为 50Mb,然后在一个小时后我再次检查时,我的大小约为 11Gb。
我对 Realm 的主要用途是在单例中,但我正在执行一个后台队列,该队列正在为每个对象排队一个新作业,因此当它发现一张照片时,它会排队另一个作业以检查它是否存在于数据库中,如果不存在则创建它,如果是这样,它会更新任何现有信息。因为它这样做,除非我在作业中声明 Realm,否则我会得到线程错误,所以每次都定义它。
下面是我的一个电话示例,任何人都可以提出一些我可能做错的事情,或者无论如何控制或压缩数据库的大小,现在它这么大?
- (void)saveMediaObject:(MLMediaObject *)mediaObject mediaGroup:(MLMediaGroup *)mediaGroup
{
[jobQueue addOperationWithBlock:
^{
NSLog(@"saveMediaObject");
lastScanResult = [NSDate date];
RLMRealm *realm = [RLMRealm defaultRealm];
SPMediaObject *spMediaObject = [SPMediaObject objectInRealm:realm forPrimaryKey:[mediaObject identifier]];
if(spMediaObject == nil)
{
spMediaObject = [[SPMediaObject alloc] init];
spMediaObject.identifier = [mediaObject identifier];
}
[realm beginWriteTransaction];
spMediaObject.lastSeen = [NSDate date];
spMediaObject.versionURL = [[mediaObject URL] path];
spMediaObject.versionMimeType = [self mimeTypeForExtension:[[spMediaObject.versionURL pathExtension] lowercaseString]];
spMediaObject.originalURL = [[mediaObject originalURL] path];
spMediaObject.originalMimeType = [self mimeTypeForExtension:[[spMediaObject.originalURL pathExtension] lowercaseString]];
if([mediaObject name] != nil)
{
spMediaObject.caption = [mediaObject name];
}
else
{
spMediaObject.caption = @"";
}
[realm addOrUpdateObject:spMediaObject];
[realm commitWriteTransaction];
}];
}
史蒂夫。