Swift Combine 和 iOS 版本限制?

huangapple go评论105阅读模式
英文:

Swift Combine and iOS version limitations?

问题

以下是翻译好的部分:

例如,AppTrackingTransparency 在 iOS 14+ 中存在,但一个应用支持 iOS 13+。

我使用了以下代码:

  1. @available(iOS 14, *)
  2. func requestATTPermissions() -> Future<ATTrackingManager.AuthorizationStatus, Never> {
  3. ...
  4. }
  5. if #available(iOS 14, *) {
  6. requestATTPermissions()
  7. .sink { [weak self] _ in
  8. self?.completion?()
  9. }
  10. .store(in: &combineSubscriptionCollector.subscriptions)
  11. } else {
  12. completion?()
  13. }

但是否可以将 if #available(iOS 14, *) { 移动到 Future/AnyPublisher 中,在 iOS 13 中工作方式类似于 Just(()),而在 iOS14+ 中请求 ATT?类似于以下方式:

  1. Just(()).map {
  2. if #available(iOS 14, *) {
  3. return requestATTPermissions()
  4. .map { status in ... }
  5. } else {
  6. return Just(())
  7. }
  8. }
  9. .sink { [weak self] _ in
  10. self?.completion?()
  11. }
  12. .store(in: &combineSubscriptionCollector.subscriptions)
英文:

For example AppTrackingTransparency exists in iOS 14+ but an app supports iOS 13+.

I used the following code:

  1. @available(iOS 14, *)
  2. func requestATTPermissions() -&gt;
  3. Future&lt;ATTrackingManager.AuthorizationStatus, Never&gt; {
  4. ...
  5. }
  6. if #available(iOS 14, *) {
  7. requestATTPermissions()
  8. .sink { [weak self] _ in
  9. self?.completion?()
  10. }
  11. .store(in: &amp;combineSubscriptionCollector.subscriptions)
  12. } else {
  13. completion?()
  14. }

But is it possible to move if #available(iOS 14, *) { into Future/AnyPublisher which in iOS 13 works like Just(()) and in iOS14+ requests ATT? Somehow like this:

  1. Just(()).map {
  2. if #available(iOS 14, *) {
  3. return requestATTPermissions()
  4. .map { status in ... }
  5. } else {
  6. return Just(())
  7. }
  8. }
  9. .sink { [weak self] _ in
  10. self?.completion?()
  11. }
  12. .store(in: &amp;combineSubscriptionCollector.subscriptions)

答案1

得分: 1

If I understand correctly, you just need to use flatMap instead of map:

  1. Just(()).flatMap { _ in
  2. if #available(iOS 14, *) {
  3. return requestATTPermisions().map { status in
  4. // 这里不需要返回任何内容...
  5. }.eraseToAnyPublisher()
  6. } else {
  7. return Just(()).eraseToAnyPublisher()
  8. }
  9. }
  10. // .sink and .store...

Though I think this is easier to read and understand:

  1. let publisher: AnyPublisher<(), Never>
  2. if #available(iOS 14, *) {
  3. publisher = requestATTPermisions().map { status in
  4. // ...
  5. }.eraseToAnyPublisher()
  6. } else {
  7. publisher = Just(()).eraseToAnyPublisher()
  8. }
  9. publisher.sink { ... }.store(in: ...)
英文:

If I understand correctly, you just need to use flatMap instead of map:

  1. Just(()).flatMap { _ in
  2. if #available(iOS 14, *) {
  3. return requestATTPermisions().map { status in
  4. // do not return anything here...
  5. }.eraseToAnyPublisher()
  6. } else {
  7. return Just(()).eraseToAnyPublisher()
  8. }
  9. }
  10. // .sink and .store...

Though I think this is easier to read and understand:

  1. let publisher: AnyPublisher&lt;(), Never&gt;
  2. if #available(iOS 14, *) {
  3. publisher = requestATTPermisions().map { status in
  4. // ...
  5. }.eraseToAnyPublisher()
  6. } else {
  7. publisher = Just(()).eraseToAnyPublisher()
  8. }
  9. publisher.sink { ... }.store(in: ...)

huangapple
  • 本文由 发表于 2023年6月26日 16:33:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/76554924.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定