#ios #swift #concurrency #ios-multithreading
#iOS #swift #параллелизм #ios-многопоточность
Вопрос:
В моем Swift
классе у меня их несколько properties
. Для этих свойств мне нужно создавать разные Concurrent Queue
или я могу использовать одну и ту же очередь?
Пожалуйста, предложите, какой из них будет лучше.
import Foundation
public class ImageCache{
public let shared = ImageCache()
private var imageFileNameDic = ["default": "default.png"]
private var notificationName = ["default.pn": "default-noti"]
//More properties will be here...
private let concurrentQueue = DispatchQueue(label: "conCurrentQueue", attributes: .concurrent)
public func setImageFileName(value: String, forKey key: String) {
concurrentQueue.async(flags: .barrier){
self.imageFileNameDic[key] = value
}
}
public func getImageFileName(forKey key: String) -> String? {
var result: String?
concurrentQueue.sync {
result = self.imageFileNameDic[key]
}
return result
}
//For notificationName dictionary do i need to declare another
//Queue or use the same Queue
public func setNotificationName(value: String, forKey key: String) {
//TODO::
}
public func getNotificationName(forKey key: String) {
//TODO::
}
}
Ответ №1:
Если они являются независимыми свойствами в среде с низким уровнем конкуренции, это не имеет большого значения. Если вы используете одну очередь, это просто означает, что вы не можете обновлять одну, одновременно обновляя другую. В то время как если вы используете отдельные очереди, вы синхронизируете их отдельно.
Кстати, вы можете упростить свои программы чтения, например
public func getImageFileName(forKey key: String) -> String? {
return concurrentQueue.sync {
return self.imageFileNameDic[key]
}
}
Или в последних версиях Swift:
public func getImageFileName(forKey key: String) -> String? {
concurrentQueue.sync {
self.imageFileNameDic[key]
}
}