Реализация блокировки чтения и записи в Swift для нескольких свойств

#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]
    }
}