ios:在后台队列块并在网络可用时执行
我正在使用parse.com API(托管后端,它提供API以将数据保存在其服务器上)开发应用程序。我希望能够无缝地在线和离线使用应用程序。 为此,我需要使用一个队列,可以放置需要网络访问的块。当网络变得可用时,块应该被串行执行,并且当网络脱机时,应该暂停队列处理。ios:在后台队列块并在网络可用时执行
我正在考虑在网络变得可用/不可用时使用带暂停/继续的GCD。 我想知道是否有更好的选择?如果应用程序放置在后台,这会工作吗?这里的例子是用户在网络不可用时(保存队列)保存一些数据,然后将应用程序置于后台。现在,当网络可用时,是否可以自动在后台进行保存?
我确实在做你想要使用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
暂停队列只会阻止操作启动 - 它不会挂起正在进行的操作。在执行操作时,您总会有可能失去网络,因此您应该在操作中说明这一点。
你看过使用AFNetworking库吗?我相信它已经融入了Reachabiltiy,并且可以按照你的意愿行事。
谢谢。我曾看过AFNetworking库,但它似乎更多的是NSURL请求,而不是任何我想在互联网可用的情况下才开始执行的任意块(它可能只对部分块执行使用网络连接)。 – Devang
我明白你的意思了......可达性的答案应该是我的下一个想法,btu我看到有人已经充实了这个想法。 –
我是GCD和Blocks的忠实粉丝,但为此我将使用NSOperationQueue
构建解决方案。 GCD在我看来更多的是低层次的东西。使用NSOperationQueue
您可以取消某些操作。你也可以表达对其他操作的依赖关系(如果你的应用程序需要这样做)。
我正在尝试这样的方法,但当连通性返回时,我遇到了“超出范围的dealloc'd”块的问题。稍后您是否有任何问题调用您的块?看起来像:“无法恢复当前帧” –