Objective-C块总是在一个单独的线程中执行吗?

ike*_*8me 8 multithreading block objective-c grand-central-dispatch sendasynchronousrequest

Objective-C块总是在一个单独的线程中执行吗?

具体来说,我问的是NSURLConnection类的sendAsynchronousRequest:queue:completionHandler方法.这是场景:

主线程(第1个线程)调用sendAsynchronousRequest方法,在第二个线程上执行sendAsynchronousRequest,当方法完成时由NSOperationQueue管理并调用commpletionHandler,它执行哪个线程?第二个线程?又是第三个线程?还是第一个帖子?

谢谢!

小智 8

块只是一个闭包,就像你用python或函数式语言一样.它们不会"运行在线程上",而是在它们被调用的地方运行.

int main(void)
{
    void (^f)(void) { printf("hello world!\n"); }
    f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是你认为它做什么,没有派遣队列,没有线程,没有任何东西.

但是,一旦你拥有了具有所有良好捕获语义的块,那么使用API​​来安排它们在各处的执行是非常诱人的.但基本上,一个块,就像一个函数指针和一个包含所有捕获的变量的ad-hoc结构一样,作为参数传递给回调(甚至它在编译器中的实现方式).


Jon*_*eet 7

它在您指定为queue参数的任何操作队列上执行它:

加载URL请求的数据,并在请求完成或失败时在操作队列上执行处理程序块.

queue参数记录为:

请求完成或失败时将处理程序块分派到的操作队列.

所以它确实取决于NSOperationQueue使用了多少线程.我希望池行为 - 所以虽然可以有多个线程,但我不希望每个处理程序有不同的线程.