2011-10-15 28 views
1

我要去嘗試解釋這個,而不顯示任何代碼,因爲我不認爲我需要...iOS線程,第二個線程看不到變量?

我有一個對象,我創建了包含數據和多種方法來訪問數據網絡服務器,在這種情況下,它然後填充所述數據以供以後檢索。

在主線程中,當視圖初始化時,我使用它需要訪問數據的URL初始化此對象。這就是它初始化時所做的一切......然後,一旦視圖加載,我就調用其中一個對象的方法,然後從Web服務器獲取數據。對於正在檢索的數據,這可能需要幾秒或更長的時間。之後,我可以調用其他方法來獲取我需要的各種數據。

我的問題是我似乎無法找到最好的方式去把它放到另一個線程。做一個簡單的performSelectorInBackground似乎不起作用,因爲初始化視圖時初始化的對象無法訪問。第二個線程無論如何都無法看到它。理論上,我可以初始化對象並運行我需要在第二個線程內運行的方法。然後將對象傳遞迴主線程......我正在尋找可能做一個performSelectorOnMainThread並以這種方式傳回對象。這會起作用嗎?

理想的情況下,這將是不錯的東西,可以讓我:

  1. 運行一些代碼在另一個線程...
  2. 等待該程序代碼來完成...
  3. 繼續上與該計劃的其餘部分。

它似乎不是那麼容易不幸。任何幫助指出我在這裏正確的方向將不勝感激。或者至少證明我關於傳回物體的理論就足夠了。

編輯:如何讀取和修改我的視圖控制器的頭文件中定義的實例變量?當我在第二個線程中運行的方法中放置一個斷點時,就像變量尚未初始化。

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就好。我不明白這裏發生了什麼。我唯一的猜測是垃圾收集者不喜歡我,但那只是一個猜測。再次,任何幫助將是偉大的。

+0

當你坐在那裏等待線程完成時,爲什麼要在線程中運行它? –

+0

因爲我不是唯一一個會使用它的人,並且如果它看起來像是懸掛的,因爲沒有加載指示符,用戶會假設某些功能無法正常工作。 – Scott

回答

0

1)iOS中沒有垃圾回收。內存管理行爲將始終如一,直至您自己的代碼的非確定性行爲(例如競爭條件)。

如果相同的代碼在一個新的項目工程,那麼無論它是不完全一樣的代碼,或它的工作原理是機會(訪問解除分配的對象可以工作偶爾,它只是在等待,雖然發生崩潰),或你的代碼中有一些非確定性條件釋放對象。

2)要做到這一點:

運行一些代碼在另一個線程...

等待該程序代碼來完成...

繼續與該程序的其他部分。

您可以使用下列之一:

  1. performSelector ...的方法的家庭,就像你使用它們。

  2. dispatch_async功能系列 - 查找它,你會發現很多 的例子。

  3. 將NSInvocationOperation/NSBlockOperation與一個完成塊 一起使用,它將控制權轉移回主線程。

  4. 專門針對HTTP請求,您可以使用ASIHTTPRequest(也在內部使用NSOperation,但爲請求的進度提供了許多額外的功能和回調)。

+0

嗯,有些東西在這裏不起作用......顯然它與線程無關,因爲它好像是我的ivars在視圖加載後正在處理。我將不得不進一步研究這一點。我要完全重寫那個視圖並仔細檢查一切。謝謝你的幫助。 – Scott

相關問題