2011-12-05 76 views
8

乍一看這似乎是一個簡單的問題,但我無法確定如何在某個後臺線程上運行匿名塊,即我正在尋找相當於-performSelector:onThread:withObject:waitUntilDone:的塊。在特定的後臺線程上運行匿名塊

相關:是否有可能將調度隊列與某個後臺線程相關聯,就像主隊列與應用程序的主線程相關聯?

編輯闡明瞭我期待運行匿名塊

回答

6

我在邁克灰的PLBlocksPlayground最近看到此功能RunOnThread()(zip文件,見BlocksAdditions.m):

void RunOnThread(NSThread *thread, BOOL wait, BasicBlock block) 
{ 
    [[[block copy] autorelease] performSelector: @selector(my_callBlock) onThread: thread withObject: nil waitUntilDone: wait]; 
} 

這就是我一直在尋找。

在PLBlocksPlayground中還有一些其他非常有用的塊相關實用程序,其中大部分Ash先生在此解釋post

+0

鏈接似乎被破壞,任何人都知道內容在哪裏? – nmr

+0

不知道現在的內容。儘管如此,我已經問過Mike Ash(PLBlocksPlayground的作者)希望我們很快會知道它的新位置。 –

+1

我更新了鏈接 - 它現在指向一個可以下載的zip文件。 –

-1

塊是一個功能。像調用任何其他函數一樣調用它。

+0

我應該提到,我正在尋找在後臺線程上運行匿名塊。 –

7

如果我理解你的權利,你應該這樣做:

dispatch_queue_t thread = dispatch_queue_create("your dispatch name", NULL); 
dispatch_async(analyze, ^{ 
    //code of your anonymous block 
}); 
dispatch_release(thread); 

你也可以寫一些方法,這將帶塊,但你應該知道什麼類型的參數,將其持有:

-(void)performBlock:(void (^)(SomeType par1, SomeType par2))block ToData:(Sometype)data; 

您可以用匿名塊稱之爲:

[something performBlock:^(SomeType par1, SomeType par2){ 
    //do your stuff 
} ToData: data] 

而且在方法,你可以打電話給你的BL玉珠作爲一個簡單的C函數:

block(par1, par2); 
+3

我不認爲GCD給出了有關調度隊列運行在哪個線程上的任何保證;所以我不認爲你的第一個解決方案會起作用。你的第二個解決方案更有趣;我認爲它應該工作 - 將嘗試並更新。 –

+0

@ChaitanyaGupta是正確的。 dispatch_queue與線程不一樣。 dispatch_queue可以在任意數量的線程上運行。 – bandejapaisa