I've got some sample data that loads in my list, but when swapping it out for data from my API service, the list is empty. This is how my View looks:
struct ChatListView: View {
@StateObject var vm = ChatListViewModel()
var uid: String?
var body: some View {
List {
ForEach(vm.messages, id: \.uid) { message in
ChatListItemView(chat: message)
}
}
.refreshable {
if let uid = uid {
vm.getNearbyThreads(identifier: uid)
}
}
}
}
My ViewModel looks like this:
final class ChatListViewModel: ObservableObject {
@Published var messages: [MessageThread] = []
@Published var hasError = false
func getNearbyThreads(identifier: String) {
let api = ApiService()
guard let data = try? api.getNearestThreads(query: identifier) else {
self.messages = []
self.hasError = true
return
}
DispatchQueue.main.async {
self.messages = data
}
}
}
And my API service code looks is this:
func getNearestThreads(query: String) -> [MessageThread] {
var messageThreads = [MessageThread]()
guard var url = URLComponents(string: API_URL) else {
return messageThreads
}
url.queryItems = [URLQueryItem(name: "uid", value: query)]
let request = URLRequest(url: url.url!)
let session = URLSession(configuration: .default)
let task = session.dataTask(with: request) { data, _, error in
guard let data = data, error == nil else {
print(error!)
return
}
do {
guard let threads = self.parse(json: data) else {
throw ApiServiceError.unableToParse(data: data)
}
DispatchQueue.main.async {
messageThreads = threads
}
}
catch {
print(error)
}
}
task.resume()
return messageThreads
}
I have a feeling that perhaps using two DispatchQueue asyncs may be causing a problem here. This is my first time doing iOS programming in years and working with SwiftUI, so I'm keen to understand if what I'm doing is impacting the view hierarchy or if I'm just not passing data around properly.