Ios 当一个方法需要很长时间才能完成时,如何避免多次调用该方法

Ios 当一个方法需要很长时间才能完成时,如何避免多次调用该方法,ios,iphone,objective-c,Ios,Iphone,Objective C,在我的应用程序中有几个视图控制器,我需要使用后台线程中运行的方法将本地内容与服务器同步。有时,若用户创建了数据,我需要将数据插入到服务器上的数据库中。我在这里使用的方法是在我需要与服务器同步的对象(核心数据中有对象)上设置一个标志(类似于isSynced=NO)。同步完成后,我的方法将删除该标志(例如isSynced=YES),以便下次不再发送该标志 现在的问题是同步方法需要很长时间才能完成(1或2秒)。如果现在用户弹出这个特定的视图控制器并迅速返回,则上一个调用仍在进行中,下一个调用将被启动。

在我的应用程序中有几个视图控制器,我需要使用后台线程中运行的方法将本地内容与服务器同步。有时,若用户创建了数据,我需要将数据插入到服务器上的数据库中。我在这里使用的方法是在我需要与服务器同步的对象(核心数据中有对象)上设置一个标志(类似于isSynced=NO)。同步完成后,我的方法将删除该标志(例如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开发中应该很常见,应该有一个标准的方法来处理它

您的单例方法可能没有必要。我不认为为每个新对象发送数据库插入有什么害处。您仍然需要确保同步每个对象。也就是说,更新“isSynched”标志。将需要同步的每个对象保留在“需要同步”列表中

然后,通过对数据库执行后台查询来更新“isSynced”标志,以检查对象是否存在。然后,使用查询结果设置isSynched标志

如果查询结果表明该对象不在数据库中,则重新发送该对象,并将其“isSynced”标志设置为否

如果查询结果表明对象在数据库中,请将“isSynced”标志设置为“是”,并将其从“需要同步”列表中删除


防止重复数据库条目的一种方法是生成唯一的密钥。例如,使用基于时间和日期的哈希值标记每个。然后配置表以确保每个键都是唯一的。

在你的单例中使用
isSyncing
对我来说似乎很好。你也可以使用
NSFetchedResultsController
来观察coreData的变化,因为你需要重新加载tableview,所以你不需要发送通知。