1

Webサーバーからデータを取得するiosアプリケーションを開発しています。このクラスのハンドラーの 1 つが呼び出されて完了するまで、他のすべてを待機させたいと思います。ディスパッチ/スレッドを使用して可能であることは知っていますが、方法がわかりません。

-(void)callWebService:(NSString*)URL:(NSString*)SOAP{
     NSURL *url = [NSURL URLWithString:URL];
     NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];

     [req setHTTPMethod:@"POST"];
     [req setHTTPBody:[SOAP dataUsingEncoding:NSUTF8StringEncoding]];


     NSURLConnection *con = [[NSURLConnection alloc] initWithRequest:req delegate:self];
     if(con){
         [con start];
     }
}

このメソッドの最後で、このクラスの外側のコードが続きます。しかし、このハンドラーが呼び出される (そして完了する) まで待ちたい:

-(void)connection:(NSURLConnection *)c didReceiveData:(NSData *)data{
    NSString *res = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",res);
    Ukol_Parser *parser = [Ukol_Parser alloc];
    [parser parseUkol:res];
}

ここのパーサーはデータを sqlite db に入れ、このクラスの外側でデータを読み取っているためです。しかし、「外部」コードは、応答を取得してハンドラーが呼び出されるよりも速く実行されています....

4

5 に答える 5

2

「他のすべてを待機させたい」場合、本当にやりたいことは同期リクエストのように思えます。

[NSURLConnection sendSynchronousRequest:returningResponse:error:]を確認してください。

ただし、これをバックグラウンド スレッドで行うようにしてください。メイン スレッドで行うと、UI がブロックされ、アプリがユーザーのタッチなどに反応しなくなるためです。

于 2012-11-10T19:16:57.320 に答える
0

didReceiveData: メソッドから通知を投稿し、他のクラスにその通知を監視させます (または、他のクラスからこのクラスへの参照を簡単に取得できる場合は、デリゲート設定を使用して、他のクラスをデリゲートとして設定できます)。これです)。通知のセレクター メソッドで、残りのコードの実行を開始します。

于 2012-11-10T20:49:36.803 に答える
0

一種のワイルドなソリューションですが、これは実際に機能しましたhttps://gist.github.com/62940 :D

于 2012-11-10T19:27:39.117 に答える
0

同期呼び出しを使用します。ただし、同期呼び出しがブロックされ、アプリがハングしたままになるため、クラスの設計が変更されます

于 2012-11-10T19:46:10.830 に答える