2

Web 制御のハードウェア デバイスと対話しています。URL ( 、または など)を介して要求を送信して、オンとオフを切り替えると、「成功」または「失敗」が返されます。ただし、これは単純なデバイスであるため、リクエストを処理している間、つまり、処理中のリクエストのステータスを返すまで、後続のすべてのリクエストを無視します。それらをキューに入れません。彼らはただ迷子になります。http://device/on?port=1http://device/off?port=3

したがって、シリアルの同期リクエストを送信する必要があります。つまり、req#1、response#1 を待ち、req#2、response#2 を待ち、req#3、response#3 を待ちます。

独自のスレッド セーフなリクエスト キューを管理し、UI スレッドにリクエストをキューの一端にプッシュさせ、別のスレッドにリクエストを一度に 1 つずつプルさせる必要がありますか?タイムアウトし、結果を UI スレッドに送り返しますか? それとも、すでにこれを行っている API に何か不足していますか?

ありがとう!

...R

4

2 に答える 2

3

機能するのは、インスタンスと、さまざまな URL 要求を実行するNSOperationQueue多数のインスタンスを使用することです。NSOperation

まず、リクエストをエンキューするクラスにキューを設定します。それへの強力な参照を維持するようにしてください。

@interface MyEnqueingClass ()

@property (nonatomic, strong) NSOperationQueue *operationQueue;

@end

実装のどこかで、initメソッドを言います:

    _operationQueue = [[NSOperationQueue alloc] init];
    _operationQueue.maxConcurrentOperationCount = 1;

基本的にシリアルキューが必要なため、maxConcurrentOperationCount1.

これを設定したら、次のようなコードを書きます。

[self.operationQueue addOperationWithBlock:^{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"my://URLString"]];
    NSError *error;
    NSURLResponse *response;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    if (!responseData)
    {
        //Maybe try this request again instead of completely restarting? Depends on your application.
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            //Do something here to handle the error - maybe you need to cancel all the enqueued operations and start again?
            [self.operationQueue cancelAllOperations];
            [self startOver];
        }];
    }
    else
    {
        //Handle the success case;
    }
}];

[self.operationQueue addOperationWithBlock:^{
    //Make another request, according to the next instuctions?
}];

このようにして、同期NSURLRequests を送信し、エラー状態を処理できます。これには、完全に救済して最初からやり直すことも含まれます (-cancelAllOperations呼び出された行)。これらのリクエストは次々に実行されます。

NSOperationもちろん、ブロックを使用するのではなく、カスタム サブクラスを記述し、それらのインスタンスをキューに入れることもできます。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-08-27T19:20:03.493 に答える
0

NSOperationQueue クラスを使用でき、AFNetworkingなどの組み込みの API も使用できます。

于 2012-08-27T19:00:10.923 に答える