После многих попыток я решил проблему с помощью опции библиотеки URLImage.
У URLImages есть опция задержки, которую можно использовать для задержки процесса загрузки изображения. И использование выглядит следующим образом:
URLImage(URL(string: DVRItem.getLogoUrlHD().replacingOccurrences(of: "http", with: "https", options: .literal, range: nil))!, delay: 0.25, placeholder: { _ in Image("nologo").resizable().aspectRatio(contentMode: .fill).clipped() } ){
proxy in
proxy.image
.resizable() // Make image resizable
.aspectRatio(contentMode: .fill) // Fill the frame
.clipped() // Clip overlaping parts
}
Я обновил свой DVRItem и добавил новую переменную с именем index:
var ind: Int
И использовал эту переменную, чтобы загрузить первые 5 элементов без задержки, загрузить следующие 15 элементов с задержкой 0,15 и загрузите остальные элементы с задержкой 0,25. Таким образом, он сразу загружает первые 5 элементов, а затем загружает остальные. Мой окончательный код выглядит так:
struct dvrItem: View {
var DVRItem: dvr
var ind: Int
var body: some View {
VStack( alignment: .leading) {
URLImage(URL(string: DVRItem.getLogoUrlHD().replacingOccurrences(of: "http", with: "https", options: .literal, range: nil))!, delay: (self.ind < 5) ? 0 : (self.ind < 20 ? 0.15 : 0.25), placeholder: { _ in Image("nologo").resizable().aspectRatio(contentMode: .fill).clipped() } ){
proxy in
proxy.image
.resizable() // Make image resizable
.aspectRatio(contentMode: .fill) // Fill the frame
.clipped() // Clip overlaping parts
}
.frame(width: 198, height: 114)
.cornerRadius(7)
.padding(.leading, 10)
.padding(.top, 5)
Text(self.DVRItem.getName())
.foregroundColor(Color.white)
.padding(.leading, 5)
.padding(.trailing, 5)
Text(self.DVRItem.getDescription())
.foregroundColor(Color(red: 80.0/150, green: 80.0/150, blue: 80.0/150))
.lineLimit(nil)
.padding(.leading, 5)
.padding(.trailing, 5)
Spacer()
.frame(height: 5)
}
}
}
struct dvrItem_Previews: PreviewProvider {
static var previews: some View {
dvrItem(DVRItem: channels[0].getDVR()[0], ind: 0)
}
}
И я вызываю DVRItem следующим образом и присваиваю ind значения индекса:
ForEach(1..<chan.getDVR().count, id: \.self){index in
Button(action:
{
self.str = self.chan.getDVR()[index].getHlsStreamURL()
self.refresh = false
self.ind = index
}) {
dvrItem(DVRItem: self.chan.getDVR()[index], ind: index)
.buttonStyle(PlainButtonStyle())
.padding(.trailing,3)
.cornerRadius(7)
}.buttonStyle(PlainButtonStyle())
}
Я до сих пор не знаю, почему он начинает загружаться из последнего пункта, но это решило мои проблемы. Я попробовал аналогичные решения, как в этом посте В SwiftUI, где находятся события управления, то есть scrollViewDidScroll для определения нижней части списка данных , но они не работают для горизонтальных прокруток.