2012-09-19 63 views
0

簡單的問題:會發生什麼,如果我這樣做:Objective-C performSelectorInBackground - 所謂的方法在哪裏運行?

- (void)viewDidLoad 
{ 
    [self performSelectorInBackground:@selector(myBGMethod) withObject:nil]; 
} 

-(void)myBGMethod 
{ 
    [self myOtherMethod]; 
} 

-(void)myOtherMethod 
{ 
    NSLog(@"This is not Inception"); 
    //some more code here 
} 

將在myOtherMethodNSLog()和其他代碼在主線程或後臺運行?

+1

Xcode調試器全部回答。你可以在'NSLog()'上放一個斷點,你可以看到它正在運行的線程。 – FluffulousChimp

+0

想一想 - 如果一個調用將您切換回主線程,那麼您將運行您在主線程中調用的每個iOS函數,這樣就消除了切換到背景的要點。 –

回答

1

它會在後臺線程中運行。

您可以在所有方法中調用NSLog來確認此事。默認情況下,NSLog沿進程標識(pid)輸出線程號。

1

它會在後臺運行。一旦你在另一個線程中調用myBGMethod,除非它特別請求另一個線程,否則它調用的是同一個線程。

請注意,根據您要支持的iOS版本,您可能想要了解有關Grand Central Dispatch的更多信息。它使多線程更簡單。

+0

好的,謝謝:我將閱讀文檔... –

1

如果你曾經好奇什麼的線程代碼的特定行執行上,你可以把一個斷點上線,並檢查在Xcode調試導航窗格:

enter image description here

在這種情況下, ,我把一個斷點NSLog(...)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    NSLog(@"HI!"); 
}); 

,你可以看到,我們在線程2 com.apple.root.default-priority

+0

好的,太棒了!謝謝你的提示! –