Ios 当一个方法需要很长时间才能完成时,如何避免多次调用该方法
在我的应用程序中有几个视图控制器,我需要使用后台线程中运行的方法将本地内容与服务器同步。有时,若用户创建了数据,我需要将数据插入到服务器上的数据库中。我在这里使用的方法是在我需要与服务器同步的对象(核心数据中有对象)上设置一个标志(类似于isSynced=NO)。同步完成后,我的方法将删除该标志(例如isSynced=YES),以便下次不再发送该标志 现在的问题是同步方法需要很长时间才能完成(1或2秒)。如果现在用户弹出这个特定的视图控制器并迅速返回,则上一个调用仍在进行中,下一个调用将被启动。结果是数据库中可能存在重复 我现在的方法是让Singleton对象调用同步方法:Ios 当一个方法需要很长时间才能完成时,如何避免多次调用该方法,ios,iphone,objective-c,Ios,Iphone,Objective C,在我的应用程序中有几个视图控制器,我需要使用后台线程中运行的方法将本地内容与服务器同步。有时,若用户创建了数据,我需要将数据插入到服务器上的数据库中。我在这里使用的方法是在我需要与服务器同步的对象(核心数据中有对象)上设置一个标志(类似于isSynced=NO)。同步完成后,我的方法将删除该标志(例如isSynced=YES),以便下次不再发送该标志 现在的问题是同步方法需要很长时间才能完成(1或2秒)。如果现在用户弹出这个特定的视图控制器并迅速返回,则上一个调用仍在进行中,下一个调用将被启动。
@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开发中应该很常见,应该有一个标准的方法来处理它您的单例方法可能没有必要。我不认为为每个新对象发送数据库插入有什么害处。您仍然需要确保同步每个对象。也就是说,更新“isSynched”标志。将需要同步的每个对象保留在“需要同步”列表中 然后,通过对数据库执行后台查询来更新“isSynced”标志,以检查对象是否存在。然后,使用查询结果设置isSynched标志 如果查询结果表明该对象不在数据库中,则重新发送该对象,并将其“isSynced”标志设置为否 如果查询结果表明对象在数据库中,请将“isSynced”标志设置为“是”,并将其从“需要同步”列表中删除
防止重复数据库条目的一种方法是生成唯一的密钥。例如,使用基于时间和日期的哈希值标记每个。然后配置表以确保每个键都是唯一的。在你的单例中使用
isSyncing
对我来说似乎很好。你也可以使用NSFetchedResultsController
来观察coreData的变化,因为你需要重新加载tableview,所以你不需要发送通知。