使用GCD进行背景处理

时间:2012-11-15 14:12:17

标签: objective-c cocoa-touch grand-central-dispatch

我正在开发具有db sync机制的应用程序。

我正在调用同步服务,如下所示

[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]委托] addObject:self];不是

叫。当我使用GCD(全局队列)时,不会调用此方法。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您正在使用错误的属性调用dispatch_get_global_queue方法,第一个0表示DISPATCH_QUEUE_PRIORITY_DEFAULT或任何其他预定义的优先级: DISPATCH_QUEUE_PRIORITY_HIGHDISPATCH_QUEUE_PRIORITY_DEFAULTDISPATCH_QUEUE_PRIORITY_LOWDISPATCH_QUEUE_PRIORITY_BACKGROUND

您应该将其称为:

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

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

答案 1 :(得分:0)

你尝试过这个:

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

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