如何解决Swift UI MacOS通过obj排序json
我进行了json调用以从图像中获取一些数据,但是我必须按stargazers_count
对这些项目进行排序,即之前放置的stargazers_count
最大的项目。
你能帮我吗?
代码:
import SwiftUI
import AppKit
struct Obj: Codable,Identifiable {
public var id: Int
public var name: String
public var language: String?
public var description: String?
public var stargazers_count: Int
public var forks_count: Int
}
class Fetch: ObservableObject {
@Published var results = [Obj]()
init(name: String) {
let url = URL(string: "https://api.github.com/users/"+name+"/repos?per_page=1000")!
URLSession.shared.dataTask(with: url) { data,response,error in
do {
if let data = data {
let results = try JSONDecoder().decode([Obj].self,from: data)
DispatchQueue.main.async {
self.results = results
}
print("Ok.")
} else {
print("No data.")
}
} catch {
print("Error:",error)
}
}.resume()
}
}
struct ContentViewBar: View {
@ObservedObject var fetch = Fetch(name: "github")
var body: some View {
VStack(alignment: .leading,spacing: 0) {
List(fetch.results) { el in
VStack(alignment: .leading,spacing: 0) {
Text("\(el.name) (\(el.stargazers_count)/\(el.forks_count)) \(el.language ?? "")").padding(EdgeInsets(top: 5,leading: 0,bottom: 0,trailing: 0))
if el.description != nil {
Text("\(el.description ?? "")")
.font(.system(size: 11))
.foregroundColor(Color.gray)
}
}
}.listStyle(SidebarListStyle())
// Button(action: { NSApplication.shared.terminate(self) }){
// Text("X")
// .font(.caption)
// .fontWeight(.semibold)
// }
// .padding(EdgeInsets(top: 2,bottom: 2,trailing: 2))
// .frame(width: 360.0,alignment: .trailing)
}
.padding(0)
.frame(width: 360.0,height: 360.0,alignment: .top)
}
}
struct ContentViewBar_Previews: PreviewProvider {
static var previews: some View {
ContentViewBar()
}
}
解决方法
最后,他似乎成功了。
代码:
List(fetch.results.sorted { $0.stargazers_count > $1.stargazers_count }) { el in
,
在UI绘制周期中排序可能会导致性能问题(尤其是在大型容器的情况下),因此最好进行超前或UI外流排序。
所以我建议在这里做
let results = try JSONDecoder().decode([Obj].self,from: data)
let sorted = results.sorted { $0.stargazers_count > $1.stargazers_count }
DispatchQueue.main.async {
self.results = sorted
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。