在 Swift3 和 Objective-c 代码之间共享 DispatchQueue 和 dispatch_queue_t

share DispatchQueue and dispatch_queue_t between Swift3 and Objective-c code

由于我正在尝试逐步将应用程序迁移到 Swift3 并让 objective-C 和 Swift3 一起工作,我已经解决了大多数问题,但以下问题:

在Objective-C中,我在应用程序中使用全局序列dispatch_queue_t来调度所有数据库操作,以避免在写入数据库时​​发生冲突。 Swift3 现在使用 DispatchQueue:

是否可以创建一个使用相同 dispatch_queue_t 队列的 DispatchQueue,以便我可以从 Swift3 或 Objective c 分派到同一队列并继续避免冲突?

主队列显然是共享的,所以我希望这是可能的,但找不到为我自己的队列实现这一点的方法。所以到目前为止我不得不选择一种语言(比如 Objective-C 和 dispatch_queue_t)并通过 objective 包装器发送所有 swift 请求。我希望有更好的方法来利用两种语言的原生 API

谢谢

TLDR: 你可以将 DispatchQueue 对象传递给 Objective C,它与 dispatch_queue_t.


dispatch_queue_t 的定义类似于 Objective C:

typedef NSObject<OS_dispatch_queue> *dispatch_queue_t;

在内部,OS_dispatch_queue class exists, which, according to the Swift sources 映射到 DispatchQueue:

Classes:
- Name: OS_dispatch_object
  SwiftName: DispatchObject
- Name: OS_dispatch_queue
  SwiftName: DispatchQueue

然后 further extended 用于 Swift-特定 API,但是 API 将 DispatchQueue 对象直接传递到 Objective C。参见例如调用 _swift_dispatch_sync:

@available(OSX 10.10, iOS 8.0, *)
public func sync(execute workItem: DispatchWorkItem) {
    // _swift_dispatch_sync preserves the @convention(block) for
    // work item blocks.
    _swift_dispatch_sync(self, workItem._block)
}

_swift_dispatch_syncimplemented 像这样:

void
swift::_swift_dispatch_sync(
    __swift_shims_dispatch_queue_t queue,
    __swift_shims_dispatch_block_t block)
{
    dispatch_sync(cast(queue), cast(block));
}