2012-05-10 1 views
0

私はこれに対して多くの異なる方法を試しました。 JSON APIを呼び出してレスポンスを取得し、キー値を保存してから別のパラメータで再度呼び出したいとします。最近では、forループでURLメソッドを呼び出して、通知がポストされるときにNSNotificationをconnectionDidFinishLoading:に、NSLogging値をオブザーバにポストしてみました。しかし、それは最終呼び出しの値を複数回ログに記録するだけです。私は、接続の初期化のためにこれを使用複数のNSURLConnectionが次々に呼び出しますか?

...

eventConnection=[[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] delegate:self startImmediately:NO]; 
     [eventConnection scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [eventConnection start]; 

これは、デリゲートメソッドです...

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSNotification *eventNotification=[NSNotification notificationWithName:@"eventsFound" object:nil userInfo:responseDict]; 
     [[NSNotificationQueue defaultQueue]enqueueNotification:eventNotification postingStyle:NSPostNow coalesceMask:NSNotificationCoalescingOnName forModes:nil]; 
} 

私はこれを達成することができますどのようになどの任意の提案ですか?

答えて

2

は、送信する要求とカウンタの合計数を設定します。接続が完了したら、カウンタがrquestsの総数に達したら、データを送信していたメソッドをもう一度呼び出し、送信された要求をインクリメントします。あなたはファイルからデータを使用する場合。つまり、最初の数WIDファイルにデータを書き込み、その後、uは、要求を送信する場合、それは素晴らしい

3

複数のNSURLConnection要求を効果的に連鎖させるには、一度にすべてを開始しないでください(たとえば、「in forループ」と同じように)。

代わりに、最初の要求を開始します。その後、connectionDidFinishLoadingから2番目を開始します。再度connectionDidFinishLoadingが実行されると、3番目のように開始されます。

これは、アプリの優れたデザインを見つけるのに役立つ方法のスケッチです。 1つの可能性は:

  1. 現在の状態に応じて要求を起動する責任があるステートマシンを定義します。 (状態は、あなたが行った連続ステップを表す単純な整数である可能性があります)。

  2. ステートマシンを開始します。最初の要求を起動します。

  3. 要求が行われると、connectionDidFinishLoadingはステートマシンに信号を送り、次のステップに進みます。各ステップで、

  4. とすると、ステートマシンはそのステップに対応する要求を起動します。

もちろん、他の設計オプションもあります。あなたの全体的な要件と必要なコールフローの種類によって最適です。

+0

[eventConnection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [eventConnection start]; これは、順番に1つずつ順番にAPIを呼び出すとは思いませんか? –

+1

これらは、次のように順番に開始されます。二番目を始める。三番目を始める...しかし、あなたが望むのは、最初のものが完成した後に2番目のものを始めることです。 – sergio

0

ハムからB WUD、それを読んで、

あなたはAFNetworkingのようなライブラリを使用するようにしてくださいでしたが、あなたは非同期リクエストを作成することができますし、ブロックを使用して回答を処理します。

0

NSOPerationQueueまたはブロックまたはスレッドを使用して同じことができます。他の関数を終了した後に呼び出す

関連する問題