我要去嘗試解釋這個,而不顯示任何代碼,因爲我不認爲我需要...iOS線程,第二個線程看不到變量?
我有一個對象,我創建了包含數據和多種方法來訪問數據網絡服務器,在這種情況下,它然後填充所述數據以供以後檢索。
在主線程中,當視圖初始化時,我使用它需要訪問數據的URL初始化此對象。這就是它初始化時所做的一切......然後,一旦視圖加載,我就調用其中一個對象的方法,然後從Web服務器獲取數據。對於正在檢索的數據,這可能需要幾秒或更長的時間。之後,我可以調用其他方法來獲取我需要的各種數據。
我的問題是我似乎無法找到最好的方式去把它放到另一個線程。做一個簡單的performSelectorInBackground似乎不起作用,因爲初始化視圖時初始化的對象無法訪問。第二個線程無論如何都無法看到它。理論上,我可以初始化對象並運行我需要在第二個線程內運行的方法。然後將對象傳遞迴主線程......我正在尋找可能做一個performSelectorOnMainThread並以這種方式傳回對象。這會起作用嗎?
理想的情況下,這將是不錯的東西,可以讓我:
- 運行一些代碼在另一個線程...
- 等待該程序代碼來完成...
- 繼續上與該計劃的其餘部分。
它似乎不是那麼容易不幸。任何幫助指出我在這裏正確的方向將不勝感激。或者至少證明我關於傳回物體的理論就足夠了。
編輯:如何讀取和修改我的視圖控制器的頭文件中定義的實例變量?當我在第二個線程中運行的方法中放置一個斷點時,就像變量尚未初始化。
EDITx2:
- (id)initWithText:(NSString *)strURL{
if (self) {
// Custom initialization
osSearch = [[orgSearch alloc] initWithurl:strURL];
}
return self;
}
- (void)viewDidLoad{
[self loadSearches];
[super viewDidLoad];
}
- (void)loadSearches{
[self performSelectorInBackground:@selector(workerThread) withObject:nil];
}
-(void) workerThread{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[osSearch go];
[self performSelectorOnMainThread:@selector(returnToMain) withObject:nil waitUntilDone:FALSE];
[pool release];
}
-(void)returnToMain{
UITableView* tblView = tableView;
tblView.frame = CGRectMake(0,28,320,387);
[tblView release];
}
osSearch是我試圖訪問該對象,但它似乎正在dealloced我所有的ivars。如果我在performSelectorInBackground上放置一箇中斷,我可以看到osSearch已正確初始化。一旦我進入workerThread,它就像從來沒有。我可以註釋掉「去」的電話,然後回到主線程,它仍然看起來像從未被初始化過。
就像一個測試,我創建了一個新的項目,使用相同的線程方法和對象,我能夠創建新線程並訪問視圖的ivars和對象ivars就好。我不明白這裏發生了什麼。我唯一的猜測是垃圾收集者不喜歡我,但那只是一個猜測。再次,任何幫助將是偉大的。
當你坐在那裏等待線程完成時,爲什麼要在線程中運行它? –
因爲我不是唯一一個會使用它的人,並且如果它看起來像是懸掛的,因爲沒有加載指示符,用戶會假設某些功能無法正常工作。 – Scott