0

ボタンのクリックでサーバーを呼び出すと、接続didReceiveDataが返されNull、アプリケーションがクラッシュします。しかし、データが であるかどうかを確認する条件がifあり、これを行うためのベスト プラクティスの条件でサーバー呼び出しを再度開始しますか?elseNullif

-(IBAction)btnClicked:(id)sender
{
    NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:url];

    [storeRequest setHTTPMethod:@"POST"];
    [storeRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [storeRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [storeRequest setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [storeRequest setHTTPBody:postData];

    NSURLConnection *theConnection;

    theConnection =[[NSURLConnection alloc] initWithRequest:storeRequest delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data1
{
    if (data1==nil)
    {
        [self downloadDetails];//Restart the download
    }
    else
    {
        receivedData =[[NSMutableData alloc]init];

        [receivedData appendData:data1];
    }
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSError* error;
NSMutableArray* jsonArray = [NSJSONSerialization
                             JSONObjectWithData:receivedData
                             options:kNilOptions
                             error:&error];

[appDelegate.inboxArray addObjectsFromArray:jsonArray];

}
4

2 に答える 2

0

失敗した場合にすぐにリクエストを再開する必要があるかどうかについてのあなたの質問への答えは良い習慣であり、答えはノーです。再試行する場合は、次のことを行う必要があります。

  • 別の要求が成功する可能性が十分にある場合にのみ実行してください (たとえば、ネットワーク接続が完全に失われて失敗したわけではありません。Reachabilityクラスの実装によってネットワーク接続が再確立されたことが通知された場合にのみ、再試行します)。

  • 「再試行の最大回数」ロジックを使用して、再試行を適切な回数に制限するようにします (たとえば、ユーザーのデータ プランを使い果たしたくない、デバイスのパフォーマンスや UX などを考慮したくない)。

  • 再試行する前にある程度の遅延を設定します (たとえば、サーバーが要求に圧倒されて応答していない場合、絶え間ない要求のストリームでサーバーを攻撃しても役に立ちません)。と

  • 接続に失敗し、ユーザーがアプリをフォアグラウンドに戻した場合は、そのプロセスを最初からやり直します (たとえば、「機内モードをオフにするのを忘れた」という一般的なシナリオでは、設定に移動してオフにし、アプリを元に戻します。その時点で、まだ成功していない場合、または一定の時間 (たとえば 24 時間) が経過した場合、自動的に再試行する必要があります。

特定の問題の詳細に関しては、どのdidFailWithErrorレポートを表示する必要があります。それでも問題が解決しない場合は、リクエストの前に と を調べて、値が有効であることを確認することをpostDataお勧めします。postLength

ところで、ctrahey さんの言う通り、あなたのdidReceiveData. プロセスは一般的に次のとおりです。

  • 最初に(または で)を作成するNSMutableDataときにa を作成します。NSURLConnectiondidReceiveResponse

  • にデータを追加しますdidReceiveDataが、このデータには何もしません (ストリーミング ベースの操作を行っている場合を除きます)。

  • の結果を評価し、それに基づいて行動しconnectionDidFinishLoadingます。と

  • didFailWithError上記のように実装してください。

于 2013-02-17T18:03:41.857 に答える
0

receivedData は、デリゲート メソッドの呼び出し間で保持されるストレージ期間を持つように、インスタンス変数である必要があります。一般的なパターンは、getter で遅延インスタンス化を使用することです (それを "private" にし@propertyます)。

現在の方法では、複数のチャンクを取得した場合、以前のチャンクを一掃します (実際には他のものにデータへのアクセスを許可しません)。

必要に応じて他のデリゲートメソッドを実装しているとしか思えません...

于 2013-02-17T17:14:38.900 に答える