ios:队列在后台阻塞,并在网络可用时执行

Dev*_*ang 14 queue grand-central-dispatch reachability ios parse-platform

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

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

Chr*_*lay 16

我完全按照你的目标使用NSOperationQueue.首先,创建一个串行队列并默认将其挂起:

self.operationQueue = [[[NSOperationQueue alloc] init] autorelease];
self.operationQueue.maxConcurrentOperationCount = 1;
[self.operationQueue setSuspended:YES];
Run Code Online (Sandbox Code Playgroud)

然后,创建一个Reachability实例并注册kReachabilityChangedNotification:

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

[self setReachability:[Reachability reachabilityWithHostName:@"your.host.com"]];
[self.reachability startNotifier];
Run Code Online (Sandbox Code Playgroud)

现在,在网络状态更改时启动和停止队列:

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

    if (remoteHostStatus == NotReachable) {
        [self.operationQueue setSuspended:YES];
    }
    else {
        [self.operationQueue setSuspended:NO];
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下内容排队块:

[self.operationQueue addOperationWithBlock:^{
    // do something requiring network access
}]; 
Run Code Online (Sandbox Code Playgroud)

挂起队列只会阻止操作启动 - 它不会挂起正在进行的操作.在执行操作时,您总是有可能丢失网络,因此您应该在操作中考虑到这一点.