2012-02-12 10 views
1

同期nsurlconnection要求を作成したいと思います。はい、私はその愚かなことを知っていると私は制限を知っている(UIをフリーズ)しかし、私はこれを実装するために私がサーバーから受信しているデータをガーネットに送信したい理由は、送信された順序で受信され、同期接続。もし正しく読めば。同期NSURLConnection要求を作成する方法

私はGrand Central Dispatchを使用していくつかのマルチスレッドを実現し、同期要求を実行し、メインスレッドのUIに影響を与えません...しかしこれは後で私がしたい同期接続をマスターします。

1つの問題は

はここに私のコードです..私は同期のように私の接続を設定する方法を正確にはわからないということです。

- (void)loadComics{ 

    [comics removeAllObjects]; //clears object of any old values 
    [[self tableView] reloadData]; 

    NSURL *url = [NSURL URLWithString:@"http://www.comicbookresources.com/feed.php?feed=previews"]; 

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30]; 

    //clear any existing connection 
    if (connectionInProgress) { 
     [connectionInProgress cancel]; 
     [connectionInProgress release]; 
    } 

    [xmlData release]; 
    xmlData = [[NSMutableData alloc] init]; 

    connectionInProgress = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    [xmlData appendData:data]; 
} 

- (void) connectionDidFinishLoading:(NSURLConnection *)connection{ 

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData]; 

    [parser setDelegate:self]; 

    [parser parse]; 

    [parser release]; 
    [[self tableView] reloadData]; 
} 

いずれの例も優れています。

+0

「ガーネットによって、サーバーから受信したデータが送信された順序で受信されました」という意味はありますか?同期ネットワークは、バックグラウンドスレッドであっても、ほとんどの場合、悪い設計の指標となります。 –

+0

私が知っている限り、非同期でデータが誤った順序で受信されることがあります。私が通信しなければならないデータベースエンジンは、正しい順序でデータを受信することが重要であるため、これを同期的に行う必要があります。なぜあなたはそれが悪いデザインの指標だと思っていますか、私は現在私があなたの視点に興味を持っているのは私が指示されているので、データベースエンジニアにケースを組み込むことができれば、あなたの意見に耳を傾けることができます。 –

+1

これは正しくありません。あなたは 'connection:didReceiveData:'コールバックの受信を心配する必要はありません。あなたが書いたことはうまく見えます - データを受け取ったときにそれらのチャンクを連結し、 'connectionDidFinishLoading:'で完全なデータで何かをするだけです。これは、何らかの理由で、同じデリゲートを使用して、同時に複数のNSURLConnectionを実行していた場合にのみ問題になります。しかし、あなたは一般的にそうしたくありません! –

答えて

9

同期接続を使用する場合は、+sendSynchronousRequest:returningResponse:errorを使用する必要があります。他に簡単な方法はありません。

NSURLSessionが推奨されていますが、同期接続は直接サポートされていません。

+0

大丈夫だよ..今それを使う方法を調べるつもりだ。ありがとう。 –

+0

@ C.Johns問題はありません。あなたが必要としていることがあれば、答えを受け入れることを覚えておいてください。 –

+0

それは..私は間違ったことを探していた..これは挑戦的に私が使用する必要があるものです。うまくいけば私はそれを考えることができます。 –

4

同期ネットワーキングは、バックグラウンドスレッドであっても、移動する方法ではありません。キャンセルを適切にサポートすることはできません。リソースを無駄にして、ほとんどの時間をアイドルにするバックグラウンドスレッドを停止します。 1つのURLリクエストを送信するだけであれば、これは主に学問的な問題ですが、多数のURLを送信すると別の話になることがあります。

connection:didReceiveData:コールバックが不安定になることを心配する必要はありません。あなたが書いたことはうまく見えます - あなたはそれらを受け取ったときにちょうどデータのチャンクを連結し、connectionDidFinishLoading:の完全なデータで何かをすることができます。

リダイレクトの場合、複数のconnection:didReceiveResponse:コールバックを受信することを心配する必要があります。 Apple's documentationを参照してください。この場合、今まで蓄積したデータを[xmlData setLength:0]にリセットするだけです。

最後に、iOS5または10.7を必要とし、NSURLConnectionデリゲートの複雑さを必要としない場合、新しい+[sendAsynchronousRequest:queue:completionHandler:]メソッドは、+[sendSynchronousRequest:returningResponse:error]の素晴らしい、悪くない代替手段です。

+0

よろしくお願いします。私はもう少し先に行くつもりです:) –

関連する問題