Это нормальное поведение для Publisher.Share - PullRequest
0 голосов
/ 05 августа 2020

из этой ссылки https://developer.apple.com/documentation/combine/publishers/merge/share ()

let pub = (1...3).publisher
.delay(for: 1, scheduler: DispatchQueue.main)
.map( { _ in return Int.random(in: 0...100) } )
.print("Random")
.share()

cancellable1 = pub
.sink { print ("Stream 1 received: \($0)")}
cancellable2 = pub
.sink { print ("Stream 2 received: \($0)")}

// Prints:
// Random: receive value: (20)
// Stream 1 received: 20
// Stream 2 received: 20
// Random: receive value: (85)
// Stream 1 received: 85
// Stream 2 received: 85
// Random: receive value: (98)
// Stream 1 received: 98
// Stream 2 received: 98

но если мне это нравится ниже, общий доступ не будет работать так, как я ожидал

var pub: Publishers.Share<AnyPublisher<Int, Never>> {
    (1...3).publisher
        .delay(for: 1, scheduler: DispatchQueue.main)
        .map( { _ in return Int.random(in: 0...100) } )
        .print("Random")
        .eraseToAnyPublisher()
        .share()
}
cancellable1 = pub
.sink { print ("Stream 1 received: \($0)")}
cancellable2 = pub
.sink { print ("Stream 2 received: \($0)")}

// Prints:    
// Random: receive value: (99)
// Stream 1 received: 99
// Random: receive value: (56)
// Stream 1 received: 56
// Random: receive value: (38)
// Stream 1 received: 38
// Random: receive finished
// Random: receive value: (98)
// Stream 2 received: 98
// Random: receive value: (11)
// Stream 2 received: 11
// Random: receive value: (32)
// Stream 2 received: 32

Почему не работает share со вторым случаем?

1 Ответ

2 голосов
/ 05 августа 2020

Это ожидается. pub во втором примере - это вычисляемая переменная, поэтому каждый раз, когда вы обращаетесь к ней, она пересчитывается - следовательно, pub для cancellable1 - это совершенно другой издатель, чем pub для cancellable2, и они генерируют разные случайные числа .

Это не имеет ничего общего с оператором share, это просто вызвано тем, что вы используете вычисляемое свойство, а не сохраненное.

...