【发布时间】:2014-12-31 12:37:53
【问题描述】:
我目前正在尝试在我的应用程序中使用Realm,我想使用RLMObject 的子类作为单例来存储应用程序状态。
我的第一个想法是这是不是一个非常糟糕的主意。
我的AppState 类有两个主要方法:
+ (instancetype)sharedInstance
{
static dispatch_once_t once;
static id sharedInstance = nil;
RLMResults *result = [[self class] allObjects];
if (result.count == 0) {
dispatch_once(&once, ^{
RLMRealm *realm = [RLMRealm defaultRealm];
sharedInstance = [[self alloc] init];
[realm beginWriteTransaction];
[realm addObject:sharedInstance];
[realm commitWriteTransaction];
});
}
else {
sharedInstance = [[[self class] allObjects] lastObject];
}
return sharedInstance;
}
- (void)update {
RLMRealm *realm = self.realm;
[realm beginWriteTransaction];
[realm addOrUpdateObject:[[self class] sharedInstance]];
[realm commitWriteTransaction];
}
我有一些属性用于存储有关应用程序状态的几个参数。
在我的一个视图控制器中,我收到以下错误:
'试图在写事务之外修改对象 - 调用 首先在
RLMRealm实例上开始写事务。'
出现错误的代码sn-p如下:
AppState *defaultState = [AppState sharedInstance];
defaultState.appStateX = newAppStateValue; // This is where the app crashes.
[defaultState update];
我在 -(void)update 方法中将 self.realm 更改为 [RLMRealm defaultRealm]。没有骰子!
我觉得我对单身人士和/或RLMObjects 的理解存在根本性错误。
任何帮助表示赞赏。
更新
基于Sakamoto's 答案,我修改了-(void)update 方法以接受block 作为参数。
这种方法有很大的错误空间,但我可以继续我当前的实现,而无需进行任何重大更改。
- (void)update:(void(^)(void))block {
RLMRealm *realm = self.realm;
[realm beginWriteTransaction];
block();
[realm commitWriteTransaction];
}
我更新了块中的所有属性。
【问题讨论】:
标签: ios iphone grand-central-dispatch realm