ios:在后台排队并在网络可用时执行

ios:在后台排队并在网络可用时执行,ios,queue,grand-central-dispatch,reachability,parse-platform,Ios,Queue,Grand Central Dispatch,Reachability,Parse Platform,我正在使用parse.com API(托管后端,提供API在其服务器上保存数据)开发一个应用程序。我希望能够无缝地在线和离线使用该应用程序。 为此,我需要使用一个队列来放置需要网络访问的块。当网络确实可用时,应串行执行块,当网络脱机时,应暂停队列处理 当网络变得可用/不可用时,我正在考虑将GCD与挂起/恢复一起使用。 我想知道有没有更好的选择?如果应用程序放在后台,这会起作用吗?这里的一个例子是,当网络不可用(排队)时,用户保存一些数据,然后将应用程序放在后台。现在,当网络可用时,是否可以自动在

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

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

您看过如何使用库了吗?我相信它与可达性挂钩,可以完全按照您的要求运行。

我非常喜欢GCD和块,但为此,我将使用
NSOperationQueue
构建一个解决方案。在我看来,GCD更适合低水平的东西。使用
NSOperationQueue
可以取消某些操作。此外,您还可以表示对其他操作的依赖关系(如果应用程序中需要的话)。

我使用
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];
    }
}
您可以使用以下命令将块排队:

[self.operationQueue addOperationWithBlock:^{
    // do something requiring network access
}]; 

挂起队列只会阻止操作启动,而不会挂起正在进行的操作。在执行操作时,总有可能丢失网络,因此您应该在操作中对此进行说明。

请检查。这应该可以自动完成您尝试执行的操作,并具有抵御应用程序终止的额外好处。

我们的内部项目也有类似的问题,因此我编写了一个名为OfflineRequestManager的pod,它包装了任何网络请求,并允许其排队,而不管连接情况如何。如果将解析请求(或任何内容)包装在符合OfflineRequest的对象中,则管理器将对其排队,并确保在连接允许时将其退出

最简单的用例如下所示

import OfflineRequestManager

class SimpleRequest: OfflineRequest {
    func perform(completion: @escaping (Error?) -> Void) {
        doMyParseThing(withCompletion: { response, error in
            handleResponse(response)
            completion(error)
        })
    }
}
///////
OfflineRequestManager.defaultManager(queueRequest: SimpleRequest())

谢谢我看过AFNetworking库,但它似乎更适合NSURL请求,而不是任何我只想在internet可用时开始执行的任意块(可能只在块执行的某些部分使用网络连接)。我明白你的意思。。。可达性问题是我的下一个想法,顺便说一句,我看到有人已经把这个想法具体化了。我正在尝试这样一种方法,但当连接恢复时,我遇到了“范围外解除锁定”块的问题。。稍晚一点调用块时是否遇到问题?似乎是:“无法恢复当前帧”将适当的代码添加到您的答案中,而不是将其链接起来。关于这一点,添加了一个简单的用例