当我试图逐步将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
由于
答案 0 :(得分:2)
TLDR:您可以将DispatchQueue
对象传递给Objective C,它与dispatch_queue_t
的对象相同。
dispatch_queue_t
在Objective C中定义如下:
typedef NSObject<OS_dispatch_queue> *dispatch_queue_t;
在内部,OS_dispatch_queue
班exists,根据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_sync
是implemented,如此:
void
swift::_swift_dispatch_sync(
__swift_shims_dispatch_queue_t queue,
__swift_shims_dispatch_block_t block)
{
dispatch_sync(cast(queue), cast(block));
}