我正在将我的项目从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.
}
你需要把这两把钥匙藏在一个你随时可以拿到的地方。