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

时间:2016-10-02 08:53:07

标签: objective-c grand-central-dispatch swift3

当我试图逐步将App迁移到Swift3并让Objective-C和Swift3一起工作时,我解决了大多数问题,但是以下内容:

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

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

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

由于

1 个答案:

答案 0 :(得分:2)

TLDR:您可以将DispatchQueue对象传递给Objective C,它与dispatch_queue_t的对象相同。

dispatch_queue_t在Objective C中定义如下:

typedef NSObject<OS_dispatch_queue> *dispatch_queue_t;

在内部,OS_dispatch_queueexists,根据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));
}