【问题标题】:Swift ui macos sort json by objSwift ui macos 按obj排序json
【发布时间】:2020-08-25 19:18:30
【问题描述】:

我进行了 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, leading: 0, 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()
    }
}

【问题讨论】:

标签: json swift macos sorting swiftui


【解决方案1】:

最后,他似乎成功了。

代码:

List(fetch.results.sorted { $0.stargazers_count > $1.stargazers_count }) { el in

【讨论】:

    【解决方案2】:

    在 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
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-14
      • 1970-01-01
      • 2018-09-14
      • 2020-12-19
      • 2019-06-09
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      相关资源
      最近更新 更多