当前位置: 首页 > 知识库问答 >
问题:

如何在swift中使用背景线程?

谷梁波
2023-03-14

如何在swift中使用线程?

dispatchOnMainThread:^{

    NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));

}];

共有3个答案

金令
2023-03-14

最佳实践是定义可多次访问的可重用函数。

e、 g.类似AppDelegate的地方。swift作为一项全球职能。

func backgroundThread(_ delay: Double = 0.0, background: (() -> Void)? = nil, completion: (() -> Void)? = nil) {
    dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) {
        background?()

        let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
        dispatch_after(popTime, dispatch_get_main_queue()) {
            completion?()
        }
    }
}

注:在Swift 2.0中,替换QOS\u CLASS\u USER\u INITIATED。QOS_CLASS_USER_启动时的上述值。取而代之的是rawValue

A.在后台运行延迟3秒的进程:

    backgroundThread(3.0, background: {
            // Your background function here
    })

B、 要在后台运行进程,然后在前台运行完成:

    backgroundThread(background: {
            // Your function here to run in the background
    },
    completion: {
            // A function to run in the foreground when the background thread is complete
    })

C、 延迟3秒-注意使用不带背景参数的完成参数:

    backgroundThread(3.0, completion: {
            // Your delayed function here to be run in the foreground
    })
柯梓
2023-03-14

Dan Beaulieu在swift5中的回答(自swift 3.0.1起也起作用)。

extension DispatchQueue {

    static func background(delay: Double = 0.0, background: (()->Void)? = nil, completion: (() -> Void)? = nil) {
        DispatchQueue.global(qos: .background).async {
            background?()
            if let completion = completion {
                DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
                    completion()
                })
            }
        }
    }

}
DispatchQueue.background(delay: 3.0, background: {
    // do something in background
}, completion: {
    // when background job finishes, wait 3 seconds and do something in main thread
})

DispatchQueue.background(background: {
    // do something in background
}, completion:{
    // when background job finished, do something in main thread
})

DispatchQueue.background(delay: 3.0, completion:{
    // do something in main thread after 3 seconds
})
傅阳炎
2023-03-14

在Swift 3.0中,很多功能都得到了更新。在后台队列中运行的内容如下所示:

DispatchQueue.global(qos: .userInitiated).async {
    print("This is run on a background queue")

    DispatchQueue.main.async {
        print("This is run on the main queue, after the previous code in outer block")
    }
}
let qualityOfServiceClass = QOS_CLASS_USER_INITIATED
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
    print("This is run on a background queue")

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        print("This is run on the main queue, after the previous code in outer block")
    })
})

在Swift 1.1版本中,苹果不支持上述语法,只做了一些修改。传递QOS\u CLASS\u USER\u INITIATED实际上不起作用,而是使用Int(QOS\u CLASS\u USER\u INITIATED.value)。

有关更多信息,请参阅苹果留档

 类似资料:
  • 问题内容: 我有一个带有文本的元素。每当我降低不透明度时,我就会降低整个身体的不透明度。有什么办法可以让我变得更黑,而不是其他所有? 问题答案: 只需将此代码添加到您的图像CSS 更新:并非所有浏览器都支持RGBa,因此您应该具有“后备颜色”。该颜色很可能是纯色(完全不透明),例如:。

  • 问题内容: 有没有已知的方法可以使IE中的CSS样式起作用? 问题答案: 有点晚了,但这也可能有用。有一个适用于IE 5.5+的IE过滤器,您可以应用: 但是,这会缩放整个图像以适合分配的区域,因此,如果您使用的是精灵,这可能会引起问题。

  • 我没有使用 CSS3。所以我不能使用或属性。如果不使用这些属性,如何使 透明?它应该是此链接中的文本框示例。此处的文本框背景色是透明的。我想做同样的事情,但不使用上面提到的属性。

  • 问题内容: 在Objective-C中,使用Sprite-Kit,我将在Objective-C中 成功 使用类似以下代码的内容来展示新场景 在尝试将我的简单游戏移植到Swift时,到目前为止,我已经完成了这项工作… 但是我不知道要写什么代码才能真正过渡到另一个场景。问题: 有人可以提供在Swift中使用SKTransition的示例吗? 假设您将使用Objective-C,通常是否会创建另一个“文

  • 我有一个swift文件,有几叠,其中上面的文字行为怪异,我想不明白为什么“控制器”的背景颜色——文字一直延伸到屏幕的末端,我该如何调整背景的高度?

  • 问题内容: 我一直在尝试产生基本的径向渐变背景,但没有成功。我设法获得了线性渐变,如下面的代码所示,但是我不知道如何使用不同的颜色使其呈放射状- 如下图所示。任何帮助将不胜感激。:) 问题答案: 看看我的RadialGradientLayer的实现,可以随时对其进行修改 就我而言,我只需要使用两种颜色,如果需要更多颜色,则需要修改中声明的数组。同样,在从此类创建对象之后,请不要忘记调用它,否则它将