2010-12-28 27 views
0

私は、SOAPサービスのメッセージフォーマットを使用してWebサービスメソッドを呼び出すiPhoneアプリケーションを作成しています。 テーブルビューには表示する前にそれらのデータが必要なので、同期プロセスが必要です。 私は[NSURLConnection sendSynchronousRequest:returningResponse:error:]を使用します。NSURLConnection同期問題

問題は、メソッド呼び出し後にエラーメッセージなしでプログラム全体が終了することです。 [NSURLConnection sendSynchronousRequest:returningResponse:error:]の直後にNSLogステートメントを置いても、 出力がないので、そのメソッド呼び出し中にプログラムが終了することが確実です。実際には の間にそのHTTP要求と応答のもの。

しかし、そのメソッド呼び出しの前にブレークポイントを設定し、デバッグモードでプログラムを実行すると、すべてが正常に実行され、プログラムは終了せず、結果も得られます。

何が起こっているのか把握できますか?おかげさまで

- (void) sendSyncHTTPRequest:(NSString *)request_data operation:(ServOperationSync *)serv_ops { 
id<ServiceData> serv_data = serv_ops.dataDelegate; 
NSURL *urlAddr = [NSURL URLWithString:[serv_data getServURL]]; 

urlRequest = [NSMutableURLRequest requestWithURL:urlAddr 
            cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
           timeoutInterval:90]; 
NSData *requestData = [request_data dataUsingEncoding:NSUTF8StringEncoding]; 
[urlRequest setValue:@"MobilePortal" forHTTPHeaderField:@"User-Agent"]; 
[urlRequest setValue:[serv_data getSoapAction] forHTTPHeaderField:@"SOAPAction"]; 
[urlRequest setValue:[NSString stringWithFormat:@"%u", [requestData length]] forHTTPHeaderField:@"Content-Length"]; 
[urlRequest setValue:urlAddr.host forHTTPHeaderField:@"Host"]; 
[urlRequest setHTTPMethod:@"POST"]; 
[urlRequest setHTTPBody:requestData]; 

NSLog(@"just before sending http request"); 
[serv_ops.responseData setData:[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&urlResponse error:&urlError]]; 
NSLog(@"after sending http request"); 

} urlResponseとurlErrorは、インスタンス変数として宣言されていること

注意。

+0

さらに詳しい情報があります。 私は、プログラムを実行し、私はコンソールツールバーから "一時停止"を押して、 プログラムを再開すると、すべてのものが良いです、私は結果を得る。 私はプログラムを実行する場合、何もせずにそれを実行させると、プログラムはメッセージなしで終了します。 これは、プログラムが独自のプロセスやスレッド、実行ループなどで実行できないようです。 私はデバッグモードでプログラムを実行するか、または を一時停止しても問題ないと思うので、実際にプログラムプロセスを他のものに接続するか、 GDBでフックするようにしますか? すべての情報をいただければ幸いです。 – user556623

+0

NSURLConnectionがあなたのクラッシュの原因であると確信していますか? –

答えて

0

あなたが必要とする:あなたは理由を見つけるために私たちに十分なコードを提供していませんでしたあなたのコード

    • 実行ループを、あなたNSURLConnection 代表者
  • +0

    こんにちは、Neilvert、お返事ありがとうございます。同期でデリゲートパラメータが提供されないため、非同期を使用する必要があると言っていますか?私は、空のテーブルビューがポップアップするのを防ぐために、非同期を使って私が望むものを達成する方法を知りたいだけです。私はまだ何らかの方法でスレッドをブロックする必要があると思いますが、これはまったく同期的ではありませんか? – user556623

    3

    を忘れないでください、あなたのアプリは正しく動作しません。

    [NSURLConnection sendSynchronousRequest:returningResponse:error:]を使用すると、現在のスレッドをブロックするので、一般的には悪い考えです。あなたはおそらくメインスレッドから呼び出すでしょう、これはUIをブロックします。アプリケーションはタッチに反応せず、リクエストが長くなると凍ったように感じます(特にEDGEのような低帯域幅の接続の場合)。

    ネットワークの性質は非同期です。ですから、代わりに非同期リクエストを作成するか、GCDを使用することをお勧めします。デリゲートメソッド(connection:didReceiveDataなど)でTableviewを更新します。テーブルビューのデータをNSMutableArrayに保存し、アレイを変更した後に[tableView reloadData]]に電話することができます。テーブルビューは、UITableViewDataSourceデリゲートメソッドの配列から構築されます。

    +0

    [NSURLConnection sendSynchronousRequest:returningResponse:error:]は問題を引き起こすことは確かです。これは、NSLogをその直前と直後に置くので、前者は表示でき、後者はメッセージを表示しないからです。実際に私はこの同期を使用する必要があります。これは、アプリケーションが起動したとき、applicationDidFinishLaunchingメソッドで呼び出すときに、テーブルビューであるアプリケーションで最初のビューにデータを取り込む必要があるためです。非同期の方法を使用すると、ウィンドウがすぐに表示され、空のナビゲーションビューとテーブルビューが表示されますが、これはうまくいきません。 – user556623