我的应用程序中有几个视图控制器,我需要使用在后台线程中运行的方法将本地内容与服务器同步。有时,如果用户创建了数据,我需要在服务器上插入数据到数据库。我在这里使用的方法是在需要与服务器同步的对象上设置一个标志(类似于isSynced = NO)(对象在Core Data中)。当同步完成时,我的方法将摆脱该标志(例如isSynced = YES),因此下次不会再发送它。
现在的问题是同步方法需要很长时间才能完成(1或2秒)。如果现在用户弹出这个特定的视图控制器并迅速返回,则前一个呼叫仍在进行中,下一个呼叫将被启动。结果是数据库中可能存在重复。
我现在的方法是使一个Singleton对象调用同步方法:
@property (nonatomic) BOOL isSyncing;
//every time before syncing. check if object is available for syncing
if (!isSyncing) {
isSyncing = YES;
// sync server
// when complete
isSyncing = NO;
// post notification to view controller to reload table
} else {
// cancel because previous call is not finished
}
我担心的是,如果取消呼叫,我的视图控制器将无法接收通知等待。我可以通过在取消时发布另一个通知来解决这个问题。我想知道这是否是正确的,因为我认为这个问题在iOS开发中应该很常见,应该有一个标准的方法来处理它
答案 0 :(得分:0)
您的单身方法可能没有必要。我没有看到为每个新对象发送数据库插入的危害。您仍然需要确保每个对象都已同步。也就是说,更新“isSynched”标志。将需要同步的每个对象保存在“需要同步”列表中。
然后,通过对数据库执行后台查询来更新“isSynced”标志,以检查对象是否退出。然后,使用查询结果设置isSynched标志。
如果查询结果表明该对象不在数据库中,则重新发送该对象并将其“isSynced”标志设置为NO。
如果查询结果表明对象在数据库中,请将“isSynced”标志设置为YES,并将其从“需要同步”列表中删除。
防止重复数据库条目的方法是创建唯一键。例如,根据时间和日期标记每个哈希值。然后配置表以确保每个密钥都是唯一的。