调度队列对Swift和Objective C互操作的特定使用



我正在将我的项目从ObjC迁移到Swift。我有这样的代码:

const char *specific = "my_queue"
dispatch_queue_set_specific(myQueue, specific, (void *)specific, NULL);

在单元测试的后面,我有:

assertTrue(dispatch_get_specific(specific))

我注意到在Swift中,API已经改变了,我们不能再使用任何键类型了

let value = String(cString: specific, encoding: .utf8)
myQueue.setSpecific(DispatchSpecificKey<String>(), value)

两个api已经分化。在ObjC中,键和值都是c字符串;但是在Swift中,键是一个特殊的类型DispatchSpecificKey,这在ObjC中是不可用的。

那么我如何在Swift中设置特定,并从ObjC中获得正确的特定?

另一种方式似乎也有问题:我如何在ObjC中设置特定的,并从Swift获得正确的特定的?

这是一种奇怪的方式。您需要创建一个DispatchSpecificKey对象。假设您有一个User类,并且希望用几个DispatchQueues存储User对象。您创建一个DispatchSpecificKey对象,其中包含您想要存储的项目的类型:

let userKey = DispatchSpecificKey<User>()

然后你可以使用这个键来存储和读取用户对象。重要的是,你必须把userKey藏在某个地方,并在任何你想设置或获取这个特定值的地方使用它。

queue.setSpecific(userKey, User(name: "Smith", firstName: "John"))
let user = queue.getSpecific(userKey)

这是完全错误的做法:

queue.setSpecific(DispatchUserKey(), User(name: "Smith", firstName: "John"))

这是错误的,因为您丢失了DispatchUserKey对象,所以您无法再次获得该值。

现在假设你有一些(有趣的)DispatchQueues,它们都想要存储一个"卖家"。还有一个"买家"人的类型。然后写

let sellerKey = DispatchUserKey<Person>()
let buyerKey = DispatchUsrKey<Person>()
let buyer = ...
let seller = ...
let queue = ...
queue.setSpecificKey (key: sellerKey, value: seller)
queue.setSpecificKey (key: buyerKey, value: buyer)

稍后您要使用当前队列的买方:

if let buyer = DispatchKey.getSpecificKey (key: buyerKey) {
// Do something with the buyer
} else {
// Sorry, no buyer in the current queue.
}

你需要把这两把钥匙藏在一个你随时可以拿到的地方。

相关内容

  • 没有找到相关文章

最新更新