2012-02-25 53 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; 



} 

這是我的電話:

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

     [reader setRead:item]; 

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

回答

1

爲了異步NSURLConnection的功能,它需要線程的runloop進行處理。當新線程自動獲得runloop時,由您來運行。

你可以學習如何在Threading Programming Guide中做到這一點,我可以更多地解釋它,但大多數時候這不是你想要的。大部分時間在iOS中,後臺線程應該使用NSOperation或GCD進行管理。一般來說,如果你在iOS 4+上手動產生線程,你就錯了。有例外,但並不常見。

這裏的第一個問題應該是「爲什麼我甚至有這樣的後臺線程?」

如果你確實需要一個後臺線程,那麼你的做法segnaread可能是好的。

+0

我使用segnaread將我的項目標記爲在Google閱讀器中閱讀。當連接速度很慢時,它會凍結我的GUI幾秒鐘!這就是爲什麼我需要在後臺真正做到這一點。我認爲我在主線程上運行的代碼行凍結了我的應用程序 – 2012-02-26 00:37:45

+0

如果連接到網絡會凍結您的應用程序,那麼您的操作不正確。解決方案是不移動到後臺線程,但找出您正在同步連接到網絡的位置。儀器可以在這裏有所幫助。在Time Profiler的主線程中使用「對所有線程狀態進行採樣」。如果你不確定,這會告訴你你掛在哪裏。 – 2012-02-27 14:29:13

+0

非常感謝 – 2012-02-29 23:28:32

相關問題