NodeKit icon indicating copy to clipboard operation
NodeKit copied to clipboard

SPT-1998 Поддержка отмены таски для Combine

Open mrandrewsmith opened this issue 1 year ago • 1 comments

Что сделано

  • Созданы кастомные Publisher для AsyncNode и AsyncStreamNode с поддержкой отмены Task. Интерфейс и реализация сделаны по аналогии с URLSession DataTaskPublisher.

Примеры использования

Теперь для AsyncNode и AsyncStreamNode интерфейс один, но для каждого из них будет создан свой Publisher:

ChainConfigurator()
    .build() // <- Возвращает AsyncNode
    .nodeResultPublisher()
    .sink {
    }

ChainConfigurator()
    .build() // <- Возвращает AsyncStreamNode
    .nodeResultPublisher()
    .sink {
    }

При отмене подписки будет вызван cancel у созданной таски:

let cancellable = ChainConfigurator()
    .build()
    .nodeResultPublisher()
    .sink {
    }

cancellable.cancel()

При каждой новой подписке будет создана новая таска с вызовом метода process()

let publisher = ChainConfigurator()
    .build()
    .nodeResultPublisher()

publisher.sink { // <- Создается новая таска и вызывается метод  process
}

publisher.sink { // <- Создается новая таска и вызывается метод  process
}

Шарить результат можно стандартными средствами Combine:

let multicast = ChainConfigurator()
    .build()
    .nodeResultPublisher()
    .multicast { PassthroughSubject() }

multicast.sink { // <- Новая таска не создается
}

multicast.sink { // <- Новая таска не создается
}

multicast.connect() // <- Создается новая таска и вызывается метод  process

mrandrewsmith avatar Apr 17 '24 15:04 mrandrewsmith

Codecov Report

Attention: Patch coverage is 71.95946% with 83 lines in your changes are missing coverage. Please review.

Project coverage is 91.02%. Comparing base (da998b5) to head (f47756f).

Files Patch % Lines
NodeKit/NodeKit/Chains/ChainBuilder.swift 70.70% 29 Missing :warning:
NodeKit/NodeKit/Chains/ServiceChainProvider.swift 30.76% 27 Missing :warning:
...odeKit/Core/Node/Async/MergedAsyncStreamNode.swift 0.00% 11 Missing :warning:
...e/Node/Combine/Subscription/BaseSubscription.swift 70.58% 10 Missing :warning:
NodeKit/NodeKit/Core/Node/Async/AsyncNode.swift 75.00% 2 Missing :warning:
NodeKit/NodeKit/Encodings/ParameterEncoding.swift 75.00% 2 Missing :warning:
...rs/RequestBuildingLayer/URLQueryInjectorNode.swift 50.00% 2 Missing :warning:
Additional details and impacted files
@@                     Coverage Diff                      @@
##           SPT-1998-example-refresh     #131      +/-   ##
============================================================
- Coverage                     91.39%   91.02%   -0.37%     
============================================================
  Files                            83       87       +4     
  Lines                          1267     1304      +37     
============================================================
+ Hits                           1158     1187      +29     
- Misses                          109      117       +8     
Flag Coverage Δ
tests 91.02% <71.95%> (-0.37%) :arrow_down:

Flags with carried forward coverage won't be shown. Click here to find out more.

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.

codecov-commenter avatar Apr 17 '24 15:04 codecov-commenter