我有一個模型類使用領域來執行CRUD操作。如何防止不正確的線程領域訪問
我想在串行隊列上執行所有操作。
我已聲明的隊列屬性:
@property (nonatomic, strong) dispatch_queue_t realmQueue;
@property (strong,nonatomic) RLMRealm *secureRealm;
,我用單初始化隊列:
+ (id)sharedInstance {
static ActivityManager *sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[self alloc] init];
});
return sharedManager;
}
-(id)init{
self.realmQueue = dispatch_queue_create("realm_activity", DISPATCH_QUEUE_SERIAL);
dispatch_async(self.realmQueue, ^{
_secureRealm = [RLMRealm defaultRealm];
});
return self;
}
-(NSArray *)getDataOnSettingFilter{
NSMutableArray *activityArr = [NSMutableArray array];
NSString *filterSQL = //;
RLMResults *activityResults = [[[self getActivitySource]activities] objectsWhere:filterSQL];
dispatch_async(self.realmQueue, ^{
[_secureRealm beginWriteTransaction];
for (RealmActivity *activity in activityResults){
//modify realm properties
[_secureRealm addOrUpdateObject:activity];
[activityArr addObject:activity];
}
[_secureRealm commitWriteTransaction];
});
return [activityArr copy];
}
和當我打電話使用上述方法:
[[ActivityManager sharedInstance]getDataOnSettingFilter]
我得到一個崩潰,說領域是從一個不正確的線程訪問的。
我在這裏做錯了什麼。我如何檢查我是否總是在正確的線程上調用領域?
謝謝,我發現另一個原因,在領域隊列上創建的領域對象在cellForRow方法的主線程上訪問,這種情況也導致我崩潰。我確保使用領域的單元定製在領域隊列上運行! –