2012-02-25 3 views
0

私はこのコードを持っていますが、なぜこれをメインスレッドで実行する必要があるのか​​理解できません。 これをバックグラウンドで実行すると、投稿要求は行われません。バグですか? この問題を解決するにはどうすればよいですか?NSURLConnectionバックグラウンドで実行したときのバグ....どのように修正できますか?

- (void)setRead:(MWFeedItem *)entry 
{ [self getToken:YES]; 

    NSString *url=[NSString stringWithFormat:@"https://www.google.com/reader/api/0/edit-tag?a=user/-/state/com.google/read&i=%@&T=%@", entry.identifier, token]; 

    [self postRequestWithURLState:url]; 

} 
- (void)postRequestWithURLState:(NSString *)url 
{ 
    NSString *bodyRequest = nil; 
    NSURL *requestURL = [NSURL URLWithString:url]; 
    NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc] init]; 

    //NSLog(@"-------------- bodyRequest: %@", bodyRequest); 



    [theRequest setURL:requestURL]; 
    [theRequest setTimeoutInterval:0.5]; 
    [theRequest setHTTPMethod:@"POST"]; 
    [theRequest setHTTPBody:[bodyRequest dataUsingEncoding:NSASCIIStringEncoding]]; 
    [self.oauthAuthentication authorizeRequest:theRequest]; 
    [NSURLConnection connectionWithRequest:theRequest delegate:self]; 

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 



} 

これは私の呼び出しです:関数への非同期NSURLConnectionためには

-(void)segnaLettura:(MWFeedItem *)item{ 

     [reader setRead:item]; 

} 
- (void) segnaread:(MWFeedItem *)item{ 
    [self performSelectorOnMainThread:@selector(segnaLettura:) withObject:item waitUntilDone:NO]; 
} 

答えて

1

、それが処理されるように、スレッドの実行ループが必要です。新しいスレッドは自動的にランループを取得しますが、それを実行するのはあなた次第です。

Threading Programming Guideでこれを行う方法を知ることができます。詳細は説明できますが、ほとんどの場合、これはあなたが望むものではありません。ほとんどの場合、iOSではバックグラウンドスレッドはNSOperationまたはGCDで管理する必要があります。通常、iOS 4以降のスレッドを手動で作成する場合は間違っています。例外はありますが、頻繁にはありません。

ここでの最初の質問は、「なぜこれにバックグラウンドのスレッドがあるのでしょうか」です。

バックグラウンドスレッドが本当に必要な場合は、segnareadの方法が問題ありません。

+0

私はsegnareadを使用して、私のアイテムをGoogleReaderで読み取ったものとしてマークします。接続が遅い場合、GUIが数秒間フリーズします!そういうわけで私は本当にバックグラウンドでそれを行う必要があります。私は、私のアプリケーションをフリーズしているメインスレッド上で実行するコード行は –

+0

と思うネットワークに接続している場合、あなたのアプリケーションをフリーズしている、あなたはそれを間違っている。解決策は、バックグラウンドスレッドに移動するのではなく、同期してネットワークに接続している場所を把握することです。インストゥルメントはここで役立ちます。 Time Profilerのメインスレッドだけで、 "Sample All Thread States"を使用してください。これは、あなたが不明な場合にあなたがぶら下がっている場所を表示します。 –

+0

ありがとう –

関連する問題