在特定的后台线程上运行匿名块

Cha*_*pta 8 cocoa cocoa-touch objective-c grand-central-dispatch

乍一看,这似乎是一个简单的问题,但我无法想象如何在某个背景线程上运行匿名块,即我正在寻找相当于的块-performSelector:onThread:withObject:waitUntilDone:.

相关:是否可以将调度队列与某个后台线程相关联,就像主队列与应用程序的主线程相关联一样?

编辑澄清我正在寻找运行匿名块

igo*_*fed 6

如果我理解你,你应该这样做:

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

你也可以写一些方法,它会阻止它,但你应该知道它将包含哪种类型的参数:

-(void)performBlock:(void (^)(SomeType par1, SomeType par2))block ToData:(Sometype)data;
Run Code Online (Sandbox Code Playgroud)

你可以用匿名块来调用它:

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

在方法中,您可以将块调用为简单的C函数:

block(par1, par2);
Run Code Online (Sandbox Code Playgroud)

  • 我不认为GCD可以保证调度队列运行在哪个线程上; 所以我认为你的第一个解决方案不会起作用.你的第二个解决方案更有趣; 我认为它应该工作 - 将尝试并更新. (3认同)

Cha*_*pta 6

RunOnThread()最近在Mike Ash的PLBlocksPlayground中看到了这个函数(zip文件,请参阅BlocksAdditions.m):

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

这就是我想要的.

在PLBlocksPlayground中有许多其他非常有用的块相关实用程序,其中大部分是Ash先生在这篇文章中解释.