Bereksperimen dengan Combine, saya telah melihat metode AnyCancellable.store(in:) untuk mempertahankan Pelanggan. Saya bertanya-tanya dengan pengaturan ini:

class Controller
{
  static var cancellables = Set<AnyCancellable>()
}

let label = UILabel(frame: .zero)

Jika ada keuntungan dibandingkan mempertahankan Subscriber dengan ini:

Controller.$value
  .assign(to: \UILabel.text, on: label)
  .store(in: &cancellables)

Atas ini:

let subscriber = Controller.$value
  .assign(to: \UILabel.text, on: label)

Controller.cancellables.insert(subscriber)

Atau jika itu terutama gaya. Keduanya tampaknya bekerja dalam pengujian.

1
Duncan Oliver 1 Maret 2020, 11:35

1 menjawab

Jawaban Terbaik

Jika Anda tahu bahwa Anda hanya memerlukan satu referensi ke AnyCancellable, Anda dapat menyimpan referensi langsung ke sana dan menghindari Set<AnyCancellable>

Kalau tidak, tidak ada perbedaan selain dari gaya. Saya lebih suka store(in:) untuk menghindari kebutuhan menggunakan variabel lokal untuk menjaga keterbacaan. (Tentu saja, Anda bisa membungkus nilai kembalian pipa Anda dalam Controller.cancellables.insert tapi itu benar-benar IMO yang jelek.)

Saya masih akan merekomendasikan menggunakan pendekatan store(in:) sehingga Anda tidak perlu mengubah implementasi Anda jika Anda melakukan pada akhirnya perlu mempertahankan lebih banyak referensi AnyCancellable.

1
Jacob Relkin 1 Maret 2020, 09:27