ios - 如何让 dispatch_async 运行

标签 ios objective-c grand-central-dispatch dispatch

在下面的代码中,在运行应用程序时, block 变量中的日志

block1

永远不会被处决,只有
NSLog(@"Delay_Expired");

请告诉我如何获取 dispatch_async运行。

主要
dispatch_block_t block1 = ^{
    for (int i = 0; i < 10; i++) {
        [NSThread sleepForTimeInterval: 700];
        NSLog(@"current i = %d", i);
    }
};
dispatch_queue_t defaultPriority = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t backgroundPriority = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
NSLog(@"Delay_Expired");

dispatch_async(defaultPriority, block1);

最佳答案

它正在运行,但它是异步运行的,你只是在它有机会完成之前退出你的应用程序。如果您在一个 GUI 应用程序中尝试此操作,该应用程序在用户手动退出之前一直处于事件状态,您会看到它的行为与您预期的一样。

如果您在命令行应用程序中执行此操作,您可以使用调度组来等待调度的代码完成,例如:

dispatch_group_t group = dispatch_group_create();

dispatch_queue_t defaultPriority = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_async(group, defaultPriority, ^{
    for (int i = 0; i < 10; i++) {
        [NSThread sleepForTimeInterval:0.7];
        NSLog(@"current i = %d", i);
    }
});

NSLog(@"Waiting");

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

NSLog(@"All done");

在大多数 GUI 应用程序中您通常不会这样做,但如果您真的希望命令行应用程序等待分派(dispatch)的代码完成,这将完成这项工作。

顺便说一句,你知道 sleepForTimeInterval 使用秒,而不是毫秒?也许您打算使用 0.7 秒,而不是 700 秒?

关于ios - 如何让 dispatch_async 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58677829/

相关文章:

ios - 如何折叠和展开 if 条件、循环、 "{ code }"中除 XCode 9 中的方法体之外的任何其他代码块?

objective-c - 使 Swift 类可用于 Interface Builder

objective-c - 为什么我们不能在当前队列上使用 dispatch_sync?

ios - 在 iOS9 中使用 UIImagePickerController 获取 iCloud 项目失败

ios - 如何使 NSStringDrawingContext 缩小文本?

iphone - 使用属性和不访问 ivar 之间的区别

objective-c - NSOperationQueue 中的屏障操作

ios - iOS并发-未达到理论最大值附近的任何地方

ios - 'imageEdgeInsets' 在 iOS 15.0 中已弃用

html - iOS Safari 手机 : Doesn't show huge images in correct size