后台线程中的iOS Sync

时间:2014-01-08 18:43:14

标签: objective-c multithreading timer sync manual

我需要一些关于后台同步的建议......

目前我有一个应用程序,它在应用程序启动后在后台开始同步,然后每隔2分钟通过计时器继续。现在我想让用户在不耐烦的情况下手动启动同步过程......但要确保当前没有正在运行的同步。

如果正在运行同步,则如果不启动新同步,则应将用户请求“重定向”到此同步,但在手动同步过程中阻止自动同步启动。

不幸的是,我不知道如何做到这一点......

谢谢你的帮助!

BR鲍里斯

2 个答案:

答案 0 :(得分:0)

你没有详细说明你是如何尝试这样做的,但一个简单的解决方案应该就是这个:

  • 为您的控制器添加一个标记:isAlreadySyncing;

  • 当你开始同步时,设置标志;完成后重置;

  • 当用户开始不耐烦地同步时,检查标志:如果是,则不要做任何事情;否则,开始同步(并设置标志,如上所述);

  • 当您的计时器触发并尝试同步时,请检查标志:如果设置了,请不要做任何事情。

希望这有帮助。

答案 1 :(得分:0)

我认为你有不同的控制器。 您需要做的是使用NSUserDefaults。

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:@"YES" forKey:@"is_sync_auto"];
[defaults setValue:@"NO" forKey:@"is_sync_manual"];
[defaults synchronize]; 

当用户开始不耐烦地同步时,检查默认值:如果是,则不做任何事情;否则,开始同步(并设置标志,如上所述)。

要重定向请求,您可以创建共享实例,然后再次调用它。

OR

更好的方法是创建一个单例类。 让单例类处理同步操作,因为不能再创建一个实例,它将解决您的问题。

+ (instancetype)sharedConnection {
    static ConnectionClass *_sharedConnection = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _shared_sharedConnection = [[ConnectionClass alloc] init];
    });

    return _sharedConnection;
}