2012-05-24 38 views
14

我正在使用parse.com API(托管后端,它提供API以将数据保存在其服务器上)开发应用程序。我希望能够无缝地在线和离线使用应用程序。 为此,我需要使用一个队列,可以放置需要网络访问的块。当网络变得可用时,块应该被串行执行,并且当网络脱机时,应该暂停队列处理。ios:在后台队列块并在网络可用时执行

我正在考虑在网络变得可用/不可用时使用带暂停/继续的GCD。 我想知道是否有更好的选择?如果应用程序放置在后台,这会工作吗?这里的例子是用户在网络不可用时(保存队列)保存一些数据,然后将应用程序置于后台。现在,当网络可用时,是否可以自动在后台进行保存?

回答

15

我确实在做你想要使用NSOperationQueue的目标。首先,创建一个串行队列,默认情况下将其挂起:

self.operationQueue = [[[NSOperationQueue alloc] init] autorelease]; 
self.operationQueue.maxConcurrentOperationCount = 1; 
[self.operationQueue setSuspended:YES]; 

然后,创建可达性实例,并注册了kReachabilityChangedNotification

[[NSNotificationCenter defaultCenter] addObserver:manager 
             selector:@selector(handleNetworkChange:) 
              name:kReachabilityChangedNotification 
              object:nil]; 

[self setReachability:[Reachability reachabilityWithHostName:@"your.host.com"]]; 
[self.reachability startNotifier]; 

现在,启动和停止队列当网络状态的变化:

-(void)handleNetworkChange:(NSNotification *)sender { 
    NetworkStatus remoteHostStatus = [self.reachability currentReachabilityStatus]; 

    if (remoteHostStatus == NotReachable) { 
     [self.operationQueue setSuspended:YES]; 
    } 
    else { 
     [self.operationQueue setSuspended:NO]; 
    } 
} 

你可以用你的排队块3210

暂停队列只会阻止操作启动 - 它不会挂起正在进行的操作。在执行操作时,您总会有可能失去网络,因此您应该在操作中说明这一点。

+0

我正在尝试这样的方法,但当连通性返回时,我遇到了“超出范围的dealloc'd”块的问题。稍后您是否有任何问题调用您的块?看起来像:“无法恢复当前帧” –

1

你看过使用AFNetworking库吗?我相信它已经融入了Reachabiltiy,并且可以按照你的意愿行事。

+0

谢谢。我曾看过AFNetworking库,但它似乎更多的是NSURL请求,而不是任何我想在互联网可用的情况下才开始执行的任意块(它可能只对部分块执行使用网络连接)。 – Devang

+0

我明白你的意思了......可达性的答案应该是我的下一个想法,btu我看到有人已经充实了这个想法。 –

0

我是GCD和Blocks的忠实粉丝,但为此我将使用NSOperationQueue构建解决方案。 GCD在我看来更多的是低层次的东西。使用NSOperationQueue您可以取消某些操作。你也可以表达对其他操作的依赖关系(如果你的应用程序需要这样做)。