小编Lex*_*Lex的帖子

视图更新后保留对视图/数据模型的参考

考虑我们有 aRootView和 a DetailViewDetailView有它自己的 BindableObject,让我们调用它DetailViewModel,我们有场景:

  1. RootView 可能会被某种全局事件更新,例如丢失的互联网连接或它自己的数据/视图模型
  2. RootView处理事件它的内容更新,这是导致新的结构DetailView要创建
  3. 如果DetailViewModelDetailViewon init创建,则会有另一个引用,DetailViewModel并且它的状态(例如选定的对象)将被遗漏

我们怎样才能避免这种情况呢?

  1. 将所有 ViewModel 存储为 EnvironmentObjects,这基本上是一个单例池。这种方法导致在不使用时将不需要的对象存储在内存中
  2. 将所有 ViewModel 从 RootView 扔给它的孩子和孩子的孩子(有上面的缺点 + 痛苦的依赖)
  3. 将独立于视图的数据对象(又名工作人员)存储为环境对象。在那种情况下,我们在哪里存储对应于模型的视图依赖状态?如果我们将它存储在 View 中,它将最终导致我们交叉更改 SwiftUI 禁止的 @States
  4. 更好的方法?

抱歉我没有提供任何代码。这个问题是关于 Swift UI 的架构概念,我们试图将声明性结构引用对象与数据结合起来。

现在,我看不到仅保留与适当视图相对应的引用的方法,并且不要将它们永远保留在当前状态的内存/环境中。

更新:

让我们添加一些代码来看看如果 VM 是由它的 View 创建的会发生什么

import SwiftUI
import Combine

let trigger = Timer.publish(every: 2.0, on: .main, in: .default)

struct ContentView: View {

    @State var …
Run Code Online (Sandbox Code Playgroud)

architecture ios swiftui

8
推荐指数
1
解决办法
1051
查看次数

实现与 URLSession 发布者的重新连接和结合

我想知道是否有一种方法可以使用新的Apple框架实现重新连接机制结合使用URLSession发布者

  • 试图在 WWDC 2019 中找到一些例子
  • 尝试waitsForConnectivity不走运(它甚至没有在自定义会话中调用委托)
  • 尝试过,URLSession.background但在发布过程中崩溃了。

我也不明白我们如何以这种方式跟踪进度
有没有人已经尝试过这样做?

更新:
似乎在 Xcode 11 Beta 中waitsForConnectivity 不起作用

upd2:
Xcode 11 GM -waitsForConnectivity正在运行,但只能在设备上运行。使用默认会话,设置标志并实现会话委托。task is waiting for connectivity无论您是否使用带回调的 init 任务,都会调用方法。

public class DriverService: NSObject, ObservableObject {

    public var decoder = JSONDecoder()
    public private(set) var isOnline = CurrentValueSubject<Bool, Never>(true)

    private var subs = Set<AnyCancellable>()
    private var base: URLComponents
    private  lazy var session: URLSession = {
        let config = URLSessionConfiguration.default
        config.waitsForConnectivity = true
        return …
Run Code Online (Sandbox Code Playgroud)

swift combine

6
推荐指数
1
解决办法
1152
查看次数

标签 统计

architecture ×1

combine ×1

ios ×1

swift ×1

swiftui ×1