Ich verwende serielle GCD-Warteschlange, um mit Realm zu arbeiten. Anwendung stürzt mit Ausnahme Realm accessed from incorrect thread
ab, wenn GCD beginnt, Threads für die Warteschlange zu wechseln. Gibt es eine Möglichkeit, ein bestimmtes Realm mithilfe der GCD-API mit einem Thread zu verknüpfen?Realm von falschem Thread zugegriffen
Hier ist ein kurzes Beispiel
self.realmQueue = dispatch_queue_create("db", DISPATCH_QUEUE_SERIAL);
__block RLMRealm *realm = nil;
dispatch_async(self.realmQueue, ^{
realm = [RLMRealm realmWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"temp"]];
});
self.motionManager = [[CMMotionManager alloc] init];
self.motionManager.accelerometerUpdateInterval = 0.001;
__block int i = 0;
__block BOOL shouldBeginWriteTransaction = YES;
[self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
dispatch_async(self.realmQueue, ^{
if (shouldBeginWriteTransaction) {
[realm beginWriteTransaction];
shouldBeginWriteTransaction = NO;
}
AccelerationEvent *event = [[AccelerationEvent alloc] init];
event.x = accelerometerData.acceleration.x;
event.y = accelerometerData.acceleration.x;
event.z = accelerometerData.acceleration.y;
event.time = [NSDate date];
[realm addObject:event];
if (i % 1000) {
dispatch_async(dispatch_get_main_queue(), ^{
self.xLabel.text = [NSString stringWithFormat:@"%f", event.x];
self.yLabel.text = [NSString stringWithFormat:@"%f", event.y];
self.zLabel.text = [NSString stringWithFormat:@"%f", event.z];
});
}
if (i % 10000 == 0) {
NSDate *startDate = [NSDate date];
[realm commitWriteTransaction];
NSLog(@"save time: %f", [[NSDate date] timeIntervalSinceDate:startDate]);
shouldBeginWriteTransaction = YES;
}
i++;
});
}];
Danke, es hat funktioniert. – Maxim
@jpsim von dem, was Sie gesagt haben, dachte ich, nur RLMRealm ist nicht threadsicher, es stellt sich heraus, dass alle RLMObject-Unterklassen aus diesem Bereich nicht threadsicher sind, auch – onmyway133
Aus der Dokumentation von Realm: "Sie können nur ein Objekt auf dem verwenden Thread, von dem es erstellt wurde, und Sie können nicht direkt auf seine Ivars für alle beibehaltenen Eigenschaften zugreifen. " https://realm.io/docs/objc/latest/#models – jpsim