2011-12-05 38 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