我在几个不同的视图控制器中使用以下代码来监听Dropbox数据存储区更改。
每个视图控制器都有一个如下定义的属性:
@property (nonatomic, retain) DBDatastore *store;
然后我使用以下代码在listenForRemoteDataChanges
内添加一个观察者:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//Listen for remote Dropbox changes
DBAccount *account = [[DBAccountManager sharedManager] linkedAccount];
if(account){
self.store = [DBDatastore openDefaultStoreForAccount:account error:nil];
__weak typeof(self) weakSelf = self;
[[PPDropboxSync sharedDropboxSync] listenForRemoteDataChanges:self.store weakController:weakSelf];
}
}
...然后使用以下方法删除观察者:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
//Stop listening for Dropbox changes
if(self.store) {
[self.store removeObserver:self];
[self.store close];
self.store = nil;
}
}
-(void)dealloc {
//Deallocate NSNotifications (prevents mistakenly calling unavailable notification which causes crashes)
[[NSNotificationCenter defaultCenter] removeObserver:self];
//Stop listening for Dropbox changes
if(self.store) {
[self.store removeObserver:self];
[self.store close];
self.store = nil;
}
}
我一直收到此错误,数据存储同步随后失败:
错误:DROPBOX_ERROR_ALREADYOPEN:database_manager.cpp:155:数据存储区默认已打开
DBDatastore
似乎从控制器到控制器保持打开状态,即使它们都有自己的self.store
属性。为什么?我以为我正在使用viewWillDisappear
方法使用[self.store close];
关闭数据存储区。知道我做错了什么吗?
答案 0 :(得分:2)
正如Clifton试图解释的那样,这意味着你在关闭第一个之前第二次打开它(对于第二个视图控制器)。数据存储区只能打开一次,直到关闭为止,这就是错误试图告诉您的内容。
也许你可以使用单身模式?