2011-10-12 34 views
2

解析Twitter數據時,我使用線程調用主URL來下載數據。它完美地完成了下載,但是當我在數據下載時點擊後退按鈕時,會拋出performSelectorOnMainThread消息。我知道我們可以使用isCancelled,但它不適合我。有沒有人遇到過這個問題並解決了它。performSelectorOnMainThread拋出郵件解除分配

- (void)LoadTwitterData 
{ 
NSString *urlString [email protected]"http://search.twitter.com/search.json?q=tabc&result_type=recent&rpp=2500"; 
NSURL *url = [NSURL URLWithString:urlString]; 

NSString *jsonString = [NSString stringWithContentsOfURL:url]; 
NSDictionary *values = [jsonString JSONValue];  

/**** Throws here *****/ 
[self performSelectorOnMainThread:@selector(didFinishLoadingResults:) withObject:values waitUntilDone:NO]; 

} 
+0

預成型選擇之前嘗試'retain'對象'values'。 – Nekto

回答

0

如果LoadTwitterData:是在後臺線程,你需要創建一個自動釋放池(如果您還沒有)。環繞你的代碼與 -

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 


//your code 

[pool drain]; 
+0

經過幾次嘗試來回加載並等待數據加載後,它仍然崩潰。它是否必須對自動釋放池中的呼叫次數做任何事情? – lifemoveson

+0

錯誤消息是否仍然相同? – Akshay

+0

是的。但是我發現有另一個主線程正在運行來加載圖片網址。並在加載圖像時崩潰。我確實在該代碼周圍放置了autorelease池,但它仍然在同一個地方失敗。 – lifemoveson

2

如果分拆使用選擇一個線程self,你需要確保self保留該線程的時間,否則(如您案)self可以釋放並且你的線程會嘗試回到殭屍中。最簡單的方法是將self作爲參數傳遞給線程。如果您使用performSelectorInBackground:withObject:你應該做這樣的事情:

[self performSelectorInBackground:@selector(LoadTwitterData) withObject:self]; 

或者,如果你使用NSThread你應該通過selfobject:初始化參數。

其實使用線程的方法最安全的方式是使靜態的方法是這樣的:

+ (void)LoadTwitterData:(id)arg 
{ 
    // ... 
    MyController *self = arg; 

    // ... do work 

    [self performSelectorOnMainThread:@selector(didFinishLoadingResults:) 
          withObject:values waitUntilDone:NO]; 

} 

這種方式,你無法通過事故避免了各種多線程問題訪問實例變量。任何和所有線程需要的數據,包括回調到self,都應該作爲'arg'傳遞,它可以是一個數組或字典或任何你需要的東西。這樣你就知道線程需要的所有東西都會在線程期間保留下來,並且因爲你沒有通過self來訪問實例變量,所以另一個線程不能在下面去改變它們。

你應該在一個線程方法做的另一件事是包住整個事情有一個自動釋放池:

- (void)LoadTwitterData 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    @try { 
     // ... 
    } @finally { 
     [pool drain]; 
    } 
} 
+0

我很想知道爲什麼有人低估了這個答案。被接受的答案(截至撰寫)並沒有解決這個問題。你正在發送一條消息給'self',因爲你點擊了後退按鈕而被釋放了。因此,您需要在線程運行時保留'self'。這是標準的東西。 –

+0

我沒有做到。我知道你的答案也是正確的。但不知道是誰投了票。 – lifemoveson

相關問題