在 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_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));
}
由于我正在尝试逐步将应用程序迁移到 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_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));
}