14

parse.com API(サーバーにデータを保存するためのAPIを提供するホスト型バックエンド)を使用してアプリを開発しています。オンラインとオフラインでシームレスにアプリを使用できるようにしたいと考えています。このためには、ネットワークアクセスを必要とするブロックを配置できるキューを使用する必要があります。ネットワークが利用可能になったら、ブロックをシリアルに実行し、ネットワークがオフラインになったときに、キューの処理を一時停止する必要があります。

ネットワークが利用可能/利用できなくなったときに、サスペンド/レジュームでGCDを使用することを考えていました。もっと良いオプションがあるかどうか疑問に思いましたか?アプリをバックグラウンドに置いた場合、これは機能しますか?ここでの適切な例は、ネットワークが利用できない場合(キューに入れられる場合)にユーザーがデータを保存してから、アプリをバックグラウンドに置くことです。ネットワークが利用可能になったときに、バックグラウンドで自動的に保存を行うことは可能ですか?

4

5 に答える 5

16

私はあなたが使用しようとしていることを正確に行いますNSOperationQueue。まず、シリアルキューを作成し、デフォルトで一時停止します。

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

次に、Reachabilityインスタンスを作成し、:に登録します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
}]; 

キューを一時停止すると、操作の開始が妨げられるだけです。進行中の操作は一時停止されません。操作の実行中にネットワークが失われる可能性は常にあるため、操作ではそのことを考慮する必要があります。

于 2012-05-25T15:46:33.233 に答える
2

-[PFObjectsaveEventually]をチェックしてください。これにより、自動的に実行しようとしていることが実行され、アプリの終了に対して回復力があるという追加の利点があります。

于 2012-05-30T01:01:33.587 に答える
1

AFNetworkingライブラリの使用を検討しましたか?Reachabiltiyにフックがあり、希望どおりに動作できると思います。

于 2012-05-24T17:26:19.470 に答える
0

私はGCDとブロックの大ファンですが、このためにを使用してソリューションを構築しNSOperationQueueます。私の意見では、GCDは低レベルのものに向いています。を使用NSOperationQueueすると、特定の操作をキャンセルすることができます。また、他の操作への依存関係を表現することもできます(これがアプリケーションで必要な場合)。

于 2012-05-25T08:27:07.833 に答える
0

内部プロジェクトでも同様の問題が発生したため、OfflineRequestManagerというポッドを作成しました。このポッドは、ネットワークリクエストをラップし、接続に関係なくキューに入れることができます。解析リクエスト(またはその他)を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())
于 2018-03-27T18:54:55.913 に答える