swiftUI 2.0 列表滚动非常慢,我找不到原因。即使 Paul Hudson 技巧也不起作用
swiftUI 2.0 list is very slow to scroll, I can't find the reason.. Even the Paul Hudson trick doesn't work
这是我的代码,我解码了一个很长的代码 json,使用一个对象,@State,...这里有什么问题为什么滚动如此缓慢?
我通过添加 .id(UUID()) 广告列表级别尝试了 Paul Hudson 技巧,但没有成功。是不是和我放错了dispatchingQueue.main.async有关系?我真的不知道。
换行符:double space 或
欢迎任何帮助!
import SwiftUI
struct ContentView: View {
@State private var shifts = [Shift]()
var body: some View {
NavigationView {
List(shifts, id: \.id) { shift in
HStack() {
Text(shift.date)
.font(.caption2)
padding()
Text(shift.name)
.font(.footnote)
padding()
Text(shift.planned)
.font(.footnote)
Text(":")
.font(.footnote)
Text(shift.replaced)
.font(.footnote)
}
}.id(UUID())
}.onAppear(perform: {
loadData()
})
}
}
extension ContentView
{
func loadData() {
let login = "xxx"
let password = "xxxx!"
let ftpServer = "www.xxxx.be"
let fileName = "export.json"
let ftpUrl = "ftp://\(login):\(password)@\(ftpServer)/\(fileName)"
guard let url = URL(string: ftpUrl) else {
print("error connection")
return
}
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
if let ShiftDataStore = try? JSONDecoder().decode(ShiftDataStore.self, from: data) {
DispatchQueue.main.async {
self.shifts = ShiftDataStore.shifts
}
}
}
}.resume()
}
}
import Foundation
struct Shift: Decodable,Hashable {
var name: String
var planned: String
var replaced: String
var gsm: String
var function: String
var replacedFunction : String
var date: String
var id: UUID = UUID()
enum CodingKeys: String, CodingKey {
case name = "N"
case planned = "S"
case replaced = "RS"
case gsm = "M"
case function = "R"
case replacedFunction = "RR"
case date = "D"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
name = try values.decode(String.self, forKey: .name)
planned = try values.decode(String.self, forKey: .planned)
replaced = try values.decode(String.self, forKey: .replaced)
gsm = try values.decode(String.self, forKey: .gsm)
function = try values.decode(String.self, forKey: .function)
replacedFunction = try values.decode(String.self, forKey: .replacedFunction)
date = try values.decode(String.self, forKey: .date)
}
}
struct ShiftDataStore: Decodable {
var shifts: [Shift]
}
通过将 padding() 更改为 spacer() 解决了滚动问题。
感谢阅读和帮助!
这是我的代码,我解码了一个很长的代码 json,使用一个对象,@State,...这里有什么问题为什么滚动如此缓慢? 我通过添加 .id(UUID()) 广告列表级别尝试了 Paul Hudson 技巧,但没有成功。是不是和我放错了dispatchingQueue.main.async有关系?我真的不知道。 换行符:double space 或 欢迎任何帮助!
import SwiftUI
struct ContentView: View {
@State private var shifts = [Shift]()
var body: some View {
NavigationView {
List(shifts, id: \.id) { shift in
HStack() {
Text(shift.date)
.font(.caption2)
padding()
Text(shift.name)
.font(.footnote)
padding()
Text(shift.planned)
.font(.footnote)
Text(":")
.font(.footnote)
Text(shift.replaced)
.font(.footnote)
}
}.id(UUID())
}.onAppear(perform: {
loadData()
})
}
}
extension ContentView
{
func loadData() {
let login = "xxx"
let password = "xxxx!"
let ftpServer = "www.xxxx.be"
let fileName = "export.json"
let ftpUrl = "ftp://\(login):\(password)@\(ftpServer)/\(fileName)"
guard let url = URL(string: ftpUrl) else {
print("error connection")
return
}
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
if let ShiftDataStore = try? JSONDecoder().decode(ShiftDataStore.self, from: data) {
DispatchQueue.main.async {
self.shifts = ShiftDataStore.shifts
}
}
}
}.resume()
}
}
import Foundation
struct Shift: Decodable,Hashable {
var name: String
var planned: String
var replaced: String
var gsm: String
var function: String
var replacedFunction : String
var date: String
var id: UUID = UUID()
enum CodingKeys: String, CodingKey {
case name = "N"
case planned = "S"
case replaced = "RS"
case gsm = "M"
case function = "R"
case replacedFunction = "RR"
case date = "D"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
name = try values.decode(String.self, forKey: .name)
planned = try values.decode(String.self, forKey: .planned)
replaced = try values.decode(String.self, forKey: .replaced)
gsm = try values.decode(String.self, forKey: .gsm)
function = try values.decode(String.self, forKey: .function)
replacedFunction = try values.decode(String.self, forKey: .replacedFunction)
date = try values.decode(String.self, forKey: .date)
}
}
struct ShiftDataStore: Decodable {
var shifts: [Shift]
}
通过将 padding() 更改为 spacer() 解决了滚动问题。 感谢阅读和帮助!