2

こんにちは、私が取り組んでいるプロジェクトでは、バックグラウンドで n-SLRequest を実行する必要があります。したがって、以下のコードが示すように、これらの要求を NSOperationQueue に追加する必要があります。

- (void)performBatchRequest:(void(^)(void))completion
{
   NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/1.1/direct_messages/new.json"];

   NSOperationQueue *queue = [[NSOperationQueue alloc] init];

   ACAccount *account = [self getStoredAccount];

   for (NSDictionary *user in self.inviteList)
   {
    [queue addOperationWithBlock:^
    {
        NSDictionary *params = @{@"screen_name" :user[@"name"],@"text":@"message" }

        SLRequest *inviteRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter
                                                      requestMethod:SLRequestMethodPOST
                                                                URL:url
                                                         parameters:];

        [inviteRequest setAccount:account];

        [inviteRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
        {
            if (error)
            {
                NSLog(@"Errror");
            }
        }];
    }];
   }
   self.inviteList = nil;
   if (completion)
   {
      completion();
   }
}

今私が疑問に思っているのは、これがバックグラウンドで複数の SLRequest を実行するために使用できる最良のアプローチであるかどうかです。どんな提案/修正も本当に感謝しています

4

1 に答える 1

1

完了ハンドラーは期待どおりに機能しません。リクエストはすべて非同期で開始されるため、すぐにif (completion) { completion(); }ステートメントに到達しますが、まだ何も完了していません。

このような非同期パターンを処理する方法はいくつかあります。目的は、多数の非同期タスクの完了を通知することです。簡単な方法の 1 つは、最初はタスクの数に等しいカウンターをセットアップすることです。1 つのタスクが終了する (または失敗する) たびに、カウンターが 1 つインクリメントされます (専用キューまたはメイン スレッドで実行するなど、慎重に同期されます)。カウンターがゼロになったら、完了ハンドラーを呼び出します。

それ以外の場合、アプローチは実行可能です。

ただし、下層のネットワーク層によって実行される同時要求の最大数を明示的に制御したい場合があります。待ち時間が問題になる場合は、同時リクエストの数を増やす必要があります。

NSOperationQueuemaxConcurrentOperationsデフォルトでは CPU の数に等しいプロパティがあります。

同時リクエストの最大数はおそらく 2 です (CPU バウンド キューと 2 つのコアの場合)。とにかく、あなたのシナリオでは、これはたまたま問題ありません。ただし、同時リクエストの最適な数は、サーバーや接続の品質など、制御できない多くの要因によって異なります。

送信するデータが非常に大きい場合は、1 に設定します。制限要因は帯域幅であるため、遅延ではありません。

それ以外の場合は、最大 4 または 5 です。同時リクエストが多いほど、アプリでより多くのメモリが使用されます。

注:NSULRConnectionホスト、IP、またはその他の要因によっては、最大同時要求数の上限が強制される場合もあります。

結論:

平均的な接続品質の平均的な環境では、多数の同時リクエストで最適化しようとしても、ユーザーはあまり改善に気付かないでしょう。ただし、大きな数値を設定すると、メモリの問題によりアプリが停止するリスクが高くなります。

2時にして、幸せになってください。;)

于 2013-09-13T08:28:05.640 に答える