美文网首页
WWDC2019 Combine in Practice

WWDC2019 Combine in Practice

作者: Jerrydu96 | 来源:发表于2019-07-18 23:53 被阅读0次

    简单的将Publisher的输出编码为JSON

    .decode(MagicTrick.self, JSONDecoder())
    

    Failure Handling Operators

    assertNoFailure
    retry
    catch
    mapError
    setFailureType
    

    可以通过以下代码来在失败的时候来替换一个Publisher

    .flatMap { data in
        return Just(data)
            .decode(MagicTrick.self, JSONDecoder())
            .catch {
                return Just(MagicTrick.placeholder)//返回一个默认值继续
             }
    }
    .publisher(for: \.name)//新的Publisher
    

    Scheduled Operators

    delay//延迟
    debounce//不超过
    throttle
    receive(on:)//放到别的地方
    subscribe(on:)
    

    Scheduler describers
    ·When
    ·Where
    Supported by RunLoop andDispatchQueue

    取消任务 Cancellation

    // Using Subscribers with Combine
    let trickNamePublisher = ...
    let canceller = trickNamePublisher.assign(to: \.someProperty, on: someObject)
    
    //...
    canceller.cancel()
    
    

    Built into Combine
    Terminate subscriptions early

    自动执行cancel在deinit的时候
    protocol Cancellable {
        func cancel()
    }
    final class AnyCancellable: Cancellable {} //Calls 'cancel' on deinit
    

    Subjects

    Behave like both Publisher and Subscriber
    Broadcast values to multiple subscribers

    protocol Subject: Publisher, AnyObject {
        func send(_ value: Output)
        func send(completion: Subscribers.Completion<Failure>)
    }
    
    // Using Subjects with Combine
    let trickNamePublisher = ... // Publisher of <String, Never>
    
    let magicWordsSubject = PassthroughSubject<String, Never>()
    
    trickNamePublisher.subscribe(magicWordsSubject)
    
    let canceller = magicWordsSubject.sink { value in
        // do something with the value
    }
    
    magicWordsSubject.send("Please")
    
    let sharedTrickNamePublisher = trickNamePublisher.share()
    

    Working with SwiftUI

    SwiftUI owns the Subscriber
    You just need to bring a Publisher

    SwiftUI BindableObject
    //这就是SwiftUI可以实时更新的原理之一
    protocol BindableObject {
        associatedtype PublisherType : Publisher where PublisherType.Failure == Never
        var didChange: PublisherType { get } 
    }
    
    // you can see more things in
    Data Flow in SwiftUI WWDC 2019
    
    // Combine with SwiftUI
    class WizardModel : BindableObject {
        var trick: WizardTrick { didSet { didChange.send() }
        var wand: Wand? { didSet { didChange.send() }
    
        let didChange = PassthroughSubject<Void, Never>()
    }
    

    @Published

    Property wrapper
    Adds a publisher to any property

    //Using @Published
    @Published var password: String = ""
    
    self.password = "1234"
    
    let currentPassword: String = self.password
    
    let printerSubscription = $password.sink {
        print("The published value is '\($0)'") // now is "password"
    }
    
    self.password = "password" 
    

    Debounce

    Use Combine Today

    Compose small parts into custom publishers
    Adopt incrementally
    Add a Publisher to a property with @Published
    Compose callbacks and Publishers with Future

    相关文章

      网友评论

          本文标题:WWDC2019 Combine in Practice

          本文链接:https://www.haomeiwen.com/subject/bcfdlctx.html