Swift 使用联合收割机在控制器之间传递数据不工作

Swift 使用联合收割机在控制器之间传递数据不工作,swift,combine,Swift,Combine,我开始使用swift进行联合收割机,但有一些困难(以前在swiftui工作过)。 因此,问题是如何执行某些操作: 假设我有vc1。我从那里转到vc2 然后我开始异步操作系统网络关闭,然后返回vc1(通过弹出vc2) 现在,假设我想在返回vc1时,将一个字符串从vc2的asycnrhoss clousre迁移到vc1。 我怎样才能做到这一点 我想使用lets say的发布者 如何在vc1中订阅并从vc2发布或发送 我正在使用这种方法,但它不起作用,它从不在sink下进行编码…… public cl

我开始使用swift进行联合收割机,但有一些困难(以前在swiftui工作过)。 因此,问题是如何执行某些操作:

  • 假设我有vc1。我从那里转到vc2 然后我开始异步操作系统网络关闭,然后返回vc1(通过弹出vc2)
  • 现在,假设我想在返回vc1时,将一个字符串从vc2的asycnrhoss clousre迁移到vc1。 我怎样才能做到这一点
  • 我想使用lets say的发布者 如何在vc1中订阅并从vc2发布或发送

    我正在使用这种方法,但它不起作用,它从不在sink下进行编码……

    public class Parent {
       public  static let shared = Parent()
       public var publisher = PassthroughSibject<String,Never>()
    }
    
    class vc1: ViewController {
       func viewdidLoad() {
         let subscription = Parent.shared.oublisehr.sink { (result) in
         print(result)
         }
      }
      func navigatetoVC1() {
      ///// some code to navigate to vc1
      }
    
      func button() {
        self.navigatetoVC1
      }
    
    }
    
    
    class vc2: ViewController {
    
       func viewDidload() {
       ///
       }
      func performsomeOperation() {
         someasyncoperation(completion: { result in
           switch result {
           case .success:
             //send some data to vc1
             Parent.shared.publisher.send("testdata")
           case .failure:
           //send some data to vc1
        })
      self.dismisVC2() //some method to pop out vc2
      } 
    
    公共类父类{
    公共静态let shared=Parent()
    public var publisher=passthroughsObject()
    }
    vc1类:视图控制器{
    func viewdidLoad(){
    将subscription=Parent.shared.oublisehr.sink{(结果)放入
    打印(结果)
    }
    }
    func navigatetoVC1(){
    /////一些导航到vc1的代码
    }
    func按钮(){
    自我导航vc1
    }
    }
    vc2类:视图控制器{
    func viewDidload(){
    ///
    }
    func performsomeOperation(){
    someasyncoperation(完成:{结果为
    切换结果{
    成功案例:
    //向vc1发送一些数据
    Parent.shared.publisher.send(“testdata”)
    案例.失败:
    //向vc1发送一些数据
    })
    self.dismisVC2()//一些弹出vc2的方法
    } 
    

    }

    您的代码几乎正确,只是您在viewdidload内部使用了anyCancelable,因此其作用域已用尽。因此,请在视图控制器外部将其用作可选的anyCancelable类型。 下面的代码应该可以工作

    class vc1: ViewController {
    var subscription = AnyCancellable?
    
       func viewdidLoad() {
         self.subscription = Parent.shared.oublisehr.sink { (result) in
             print(result)
         }
       }
      func navigatetoVC1() {
      ///// some code to navigate to vc1
      }
    
      func button() {
        self.navigatetoVC1
      }
    
    }
    

    您能分享一些示例代码或文章吗?我还有一个问题,使用singleton视图模型是否是一种良好的实践?