iOS 为什么不能从子线程退出主线程中的方法?
iOS Why wouldn't exiting a method in the main thread from a sub-thread work?
我正在 objective-c 使用以下代码使用中央调度启动异步线程:
dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);
dispatch_async(myQueue, ^{
}
非常 很长时间以来,我都无法正确退出触发此操作的 IBAction。我使用这段代码在这个 GCD 线程中包裹的主线程中做了很多代码:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
}
我最初尝试做的只是将 return;此 mainQueue 块内的语句。经过大量摆弄之后,我发现要突破包含所有这些的 IBAction return;需要在 GCD 队列中。
这是为什么?我认为 return 会退出方法,而不管它在程序中的什么位置。另外,是否可以从这样的嵌套队列调用中退出?
一个块类似于一个函数。它与定义它的代码是不同的上下文。块中的 return
语句退出该块,而不是定义该块的方法或函数。 (如果块具有非 void
return 类型,则 return
语句还给出块的 return 值。)
例如,考虑:
void foo(void)
{
int (^block)(int, int) = ^int(int a, int b) { return a + b; }
printf("3 + 5 = %d\n", block(3, 5));
}
块中的 return
语句不是来自 foo()
的 return,它只是来自块的 returns 并给出 return 的值块。该块就像一个独立的小函数,只是它的代码是在另一个函数的中间提供的,并且它可以从其定义的上下文中捕获局部变量。
现在,给 dispatch_async()
的块不接受参数或 return 值,但 return
语句的流程控制是相同的。它 return 来自该块,而不是来自包含对 dispatch_async()
的调用的方法或函数。特别是,由于 dispatch_async()
运行 块是异步的,所以很有可能(甚至可能)块不会是 运行 直到调用 [= 的方法或函数很久之后16=] 已经退出。
我正在 objective-c 使用以下代码使用中央调度启动异步线程:
dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);
dispatch_async(myQueue, ^{
}
非常 很长时间以来,我都无法正确退出触发此操作的 IBAction。我使用这段代码在这个 GCD 线程中包裹的主线程中做了很多代码:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
}
我最初尝试做的只是将 return;此 mainQueue 块内的语句。经过大量摆弄之后,我发现要突破包含所有这些的 IBAction return;需要在 GCD 队列中。
这是为什么?我认为 return 会退出方法,而不管它在程序中的什么位置。另外,是否可以从这样的嵌套队列调用中退出?
一个块类似于一个函数。它与定义它的代码是不同的上下文。块中的 return
语句退出该块,而不是定义该块的方法或函数。 (如果块具有非 void
return 类型,则 return
语句还给出块的 return 值。)
例如,考虑:
void foo(void)
{
int (^block)(int, int) = ^int(int a, int b) { return a + b; }
printf("3 + 5 = %d\n", block(3, 5));
}
块中的 return
语句不是来自 foo()
的 return,它只是来自块的 returns 并给出 return 的值块。该块就像一个独立的小函数,只是它的代码是在另一个函数的中间提供的,并且它可以从其定义的上下文中捕获局部变量。
现在,给 dispatch_async()
的块不接受参数或 return 值,但 return
语句的流程控制是相同的。它 return 来自该块,而不是来自包含对 dispatch_async()
的调用的方法或函数。特别是,由于 dispatch_async()
运行 块是异步的,所以很有可能(甚至可能)块不会是 运行 直到调用 [= 的方法或函数很久之后16=] 已经退出。