1

次の呼び出しを使用して、iPhone アプリで非同期 POST 要求を作成しています。

    [NSURLConnection connectionWithRequest:req delegate:self];

リクエストは問題なくサーバーに届いているように見えますが、どのデリゲート メソッドもヒットしません。私は実装しました:

- (void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

- (void) connectionDidFinishLoading:(NSURLConnection *)connection

- (void) connection:didFailWithError:(NSURLConnection *)connection 

これらのメソッドのログ メッセージは表示されません。connectionWithRequest:delegate: のドキュメントには次のように書かれています。

デリゲート

接続のデリゲート オブジェクト。デリゲートは、ロードが進行するにつれてデリゲート メッセージを受け取ります。デリゲートへのメッセージは、このメソッドを呼び出すスレッドで送信されます。接続が正しく機能するには、呼び出しスレッドの実行ループがデフォルトの実行ループ モードで動作している必要があります。

メインスレッドから呼び出しが行われていると思います(新しいスレッドを明示的に開始しなかった場合、すべてが1つのスレッドで実行されるという仮定は正しいですか?)、これでスレッドをチェックしました:

CFRunLoopRef loop = CFRunLoopGetMain();
CFStringRef modeString = CFRunLoopCopyCurrentMode(loop);
NSLog(@"The main loop is running in mode: %@", modeString);

次のコンソール出力が作成されます。

2009-09-13 13:32:05.611 Stock Footage[686:20b] メイン ループは次のモードで実行されています: kCFRunLoopDefaultMode

つまり、デフォルトの実行ループ モードにあるようです。デリゲート メソッドがヒットしない理由を教えてくれる、他に確認すべきことはありますか? デリゲートは、リクエストが完了する前に死ぬわけではありません。

更新: CFRunLoopGetCurrent にはモード kCFRunLoopDefaultMode があります。

更新 (東部標準時午後 5 時 40 分): そうですね、コールバックを開始するために initWithRequest:delegate: startImmediately を使用するように切り替えましたが、実際にデリゲートを起動する connectionWithRequest:delegate の例を見たいと思います。 .

4

2 に答える 2

3

同様の問題がありました。デリゲートが呼び出されなかった理由は、connectionWithRequest を呼び出した後、接続からのデータが送信されたかどうかを確認するループを開始したためです。コントロールを RunLoop コードに返さなかったため、キューに残ったメッセージは処理されず、デリゲートのメソッドも呼び出されませんでした... connectionWithRequest を呼び出した後に重い操作を行わないようにしてください。すべてが機能するはずです。うまく。

于 2010-07-25T20:34:31.973 に答える
1

2つのことが飛び出します:

  • エラー メソッドのプロトタイプが間違っています (ただし、まだ呼び出されるはずです)。

connection: (NSURLConnection *) connection didFailWithError: (NSError *) error

  • から有効な接続が戻ってきていることを確認する必要があります+ connectionWithRequest:delegate:。リクエストを開始していない可能性もあります。
于 2009-09-13T18:36:39.153 に答える