Передача данных между контроллерами с использованием combine не работает

#swift #combine

#swift #объединить

Вопрос:

Я начинаю с combine с swift, но испытываю трудности (раньше имел опыт работы в swiftui). Итак, вопрос в том, как выполнить определенную операцию:

  1. допустим, у меня есть vc1. и я перехожу к vc2 оттуда 2. затем я запускаю закрытие сети asynchronos и возвращаюсь к vc1 (путем вывода vc2).
  2. Теперь предположим, что я хочу передать просто строку из asycnrhoss clousre vc2 в vc1, когда я вернусь к vc1. как я могу этого добиться?

Я хочу использовать publisher, скажем, <String, Never> как я могу подписаться на свой vc1 и опубликовать или отправить его из vc2?

Я использую этот подход, но он не работает, он никогда не доходит до кода под приемником…..

 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
  } 
  

}

Ответ №1:

Ваш код почти правильный, за исключением того, что вы используете свой Anycancellable внутри viewdidload, поэтому его область действия исчерпывается. Поэтому используйте его снаружи в контроллере представления как необязательный любой отменяемый тип. Приведенный ниже код должен работать.

 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
  }

}
  

Комментарии:

1. можете ли вы поделиться каким-нибудь примером кода или какой-нибудь статьей?

2. У меня есть еще один вопрос: рекомендуется ли использовать модель одноэлементного представления?