1

我正在开发具有数据库同步机制的应用程序。

我正在调用同步服务如下

[NSThread detachNewThreadSelector:@selector(sync) 
                         toTarget:[SyncService sharedInstance] 
                       withObject:nil];

但这里的问题是,同步不是在后台执行的。结果应用

将处于空闲状态,直到同步完成。所以,我想到了使用 GCD 作为背景

处理并做了以下

dispatch_async(dispatch_get_global_queue(0, 0), ^{

    [[SyncService sharedInstance]Sync]; 

});

但是即使现在同步也没有在后台执行。我希望在后台执行同步

背景。

编辑:

每当我不使用 [NSThread detachNewThreadSelector:@selector(sync)

                                toTarget:[SyncService sharedInstance] withObject:nil];, 

紧接着的下一行 [[[SyncService sharedInstance] delegate]addObject:self]; 不是

称为。当我使用 GCD(全局队列)时不会调用它。

任何帮助是极大的赞赏。

4

2 回答 2

1

您正在调用dispatch_get_global_queue具有错误属性的方法,前 0 表示或DISPATCH_QUEUE_PRIORITY_DEFAULT任何其他预定义的优先级: DISPATCH_QUEUE_PRIORITY_HIGHDISPATCH_QUEUE_PRIORITY_DEFAULT或。.DISPATCH_QUEUE_PRIORITY_LOWDISPATCH_QUEUE_PRIORITY_BACKGROUND

你应该这样称呼它:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [[SyncService sharedInstance]Sync]; 
});

文档还指出,调用+detachNewThreadSelector:toTarget:withObject:将启动一个新线程。你确定没有其他东西阻止用户界面。你在sync调用主线程的方法中做了什么?这可能意味着主线程/队列将再次阻塞。

于 2012-11-15T14:19:40.373 回答
0

你试过这个:

[[SyncService sharedInstance] performSelectorInBackground:@selector(Sync) withObject:nil]

正如 rckoenes 所说,您应该确保在 Sync 方法的主线程上没有做任何事情

于 2012-11-15T14:35:14.400 回答