значение: (сбой(Alamofire.Ошибка.явно отменена)) при использовании Alamofire publisher

#swift #macos #alamofire

#быстрый #macos #аламофайр

Вопрос:

Я изучаю SwiftUI и Alamofire. Я создал демо-приложение, подобное этому:

  import SwiftUI  import Alamofire  struct ContentView: View {  var body: some View {  Text("Hello, world!")  .padding()  .onAppear(perform: load)  }    struct TestResponse: Decodable {  let userId: Int  let id: Int  let title: String  let body: String  }    func load(){  AF.request("https://jsonplaceholder.typicode.com/posts", method: .get, parameters: nil)  .validate()  .publishDecodable(type: [TestResponse].self)  .print()  .sink { print($0) }  } }  struct ContentView_Previews: PreviewProvider {  static var previews: some View {  ContentView()  } }  

Но я получил этот вывод:

 receive subscription: (Alamofire.DataResponsePublisherlt;Swift.Arraylt;Test.ContentView.TestResponsegt;gt;.(unknown context at $1080f8314).Innerlt;Combine.Publishers.Printlt;Alamofire.DataResponsePublisherlt;Swift.Arraylt;Test.ContentView.TestResponsegt;gt;gt;.(unknown context at $7ff81332d748).Innerlt;Combine.Subscribers.Sinklt;Alamofire.DataResponselt;Swift.Arraylt;Test.ContentView.TestResponsegt;, Alamofire.AFErrorgt;, Swift.Nevergt;gt;gt;) request unlimited receive cancel receive value: (failure(Alamofire.AFError.explicitlyCancelled)) receive finished  

если я использую .response его для получения данных, все в порядке.

Спасибо за любую помощь.

Ответ №1:

Вам нужно сохранить возвращенный токен sink (о чем вы, скорее всего, получите предупреждение компилятора). В противном случае созданный вами издатель будет немедленно отменен, и основной запрос также будет отменен. Вы можете использовать Setlt;AnyCancellablegt; «до и sink {}.store(in: amp;set) » или найти альтернативное решение. Для SwiftUI вы, скорее всего, захотите поместить свою сеть в какой-то объект модели, а не в представление.