В момента се опитвам да използвам Realm в моето приложение и си помислих да използвам подклас на RLMObject
като сингълтон за съхранение на състояние на приложението.
Първата ми мисъл е дали идеята е много лоша.
Моят AppState
клас има 2 основни метода:
+ (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];
}
Имам свойства за съхраняване на няколко параметъра за състоянието на приложението.
В един от моите контролери за изглед получавам следната грешка:
„Опит за модифициране на обект извън записваща транзакция – първо извикайте beginWriteTransaction на
RLMRealm
екземпляр.“
Кодовият фрагмент, в който възниква грешката, е както следва:
AppState *defaultState = [AppState sharedInstance];
defaultState.appStateX = newAppStateValue; // This is where the app crashes.
[defaultState update];
Промених self.realm на [RLMRealm defaultRealm]
в моя -(void)update
метод. Без зарове!
Чувствам, че има нещо фундаментално нередно с разбирането ми за Singletons и/или RLMObject
s. Всяка помощ се оценява.
Актуализация
Въз основа на отговора на Сакамото промених моя -(void)update
метод, за да приема block
като аргумент. Има много място за грешки при този подход, но мога да продължа с текущото си внедряване, без да правя драстични промени.
- (void)update:(void(^)(void))block {
RLMRealm *realm = self.realm;
[realm beginWriteTransaction];
block();
[realm commitWriteTransaction];
}
Актуализирам всички имоти в блока.