代码之家  ›  专栏  ›  技术社区  ›  Teja Nandamuri

如何防止在错误线程上访问领域

  •  0
  • Teja Nandamuri  · 技术社区  · 7 年前

    我试图在串行队列上执行所有操作。

    我已声明队列属性:

    @property (nonatomic, strong) dispatch_queue_t realmQueue;
    @property (strong,nonatomic) RLMRealm *secureRealm;
    

    我使用singleton初始化队列:

    + (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]
    

    我做错了什么。如何检查我是否总是在正确的线程上调用领域?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Dávid Pásztor    7 年前

    您不应该存储对单例的引用 Realm 实例,因为您无法确保始终从同一个线程访问它。作为 领域 文件状态,

    在创建它们的线程上,否则会出现异常

    这意味着你永远不应该尝试使用 RLMRealm *realm = [RLMRealm defaultRealm]; 创建单例 实例,然后尝试从应用程序中随时随地访问它。

    RLMThreadSafeReference 创建对的引用 领域 Passing instances across threads 部分文档指出,这些引用只能使用一次,因此不能作为一个单独的实例重用。

    RLMRealm*领域=[RLMRealm defaultRealm]; ,框架会自动创建对当前使用的 领域

    最佳使用方式 领域 线程安全的方法是创建对 RLMRealm*领域=[RLMRealm defaultRealm]; 领域