#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 вы, скорее всего, захотите поместить свою сеть в какой-то объект модели, а не в представление.