Обязательно ли использовать слабые ссылки в пределах одноэлементного класса? - PullRequest
3 голосов
/ 08 октября 2019

Я наткнулся на учебник от raywenderlich, где автор дал несколько хороших советов по решению проблем с многопоточностью в синглтоне. Но при использовании замыканий внутри синглтон-класса он использует «слабый» эталонный цикл. Действительно ли это так, так как класс является одиночным, у него всегда должен быть единственный экземпляр?

    final class PhotoManager {
      private init() {}
      static let shared = PhotoManager()

      private var unsafePhotos: [Photo] = []

    let concurrentPhotoQueue = DispatchQueue(label: "com.jeesson.googlypuff.photoQueue", attributes: .concurrent)
      var photos: [Photo] {
        var photoCopy:[Photo]!    
        concurrentPhotoQueue.sync {
            photoCopy = self.unsafePhotos
        }
        return photoCopy
      }

      func addPhoto(_ photo: Photo) {

// Do we need 'weak self here.. and why?
        concurrentPhotoQueue.async(flags: .barrier) {[weak self] in
            // 1
            guard let self = self else {
                return
            }
            self.unsafePhotos.append(photo)
            DispatchQueue.main.async { [weak self] in
                //self?.postContentAddedNotification()
            }
        }



      }

    }

Учебное пособие

Ответы [ 2 ]

5 голосов
/ 08 октября 2019

В случае DispatchQueue замыкания вообще не добавляют никакого списка захвата, нигде.

DispatchQueue замыкания не вызывают циклы сохранения, поскольку self не владеет ими.

По существу захватывать списки внутри одноэлементного объекта не требуется, так как одноэлементный захват никогда не будет освобожден.

1 голос
/ 08 октября 2019

Жизненный цикл некоторых синглетонов привязан к жизненному циклу приложений. Жизненный цикл некоторых синглетонов привязан к входу / выходу из системы.

Так что, если синглтон должен быть освобожден при выходе? Я думаю, что это правильный случай, когда использование [weak self] может быть полезным даже для одиночного.

В противном случае, как сказал Вадиан, DispatchQueue замыкания не вызывают циклы сохранения, потому что self не владеет ими. Подробнее см. здесь

...