暫無描述

ContentDataSource.swift 1.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. //
  2. // ContentDataSource.swift
  3. // Flowerdex
  4. //
  5. // Created by Víctor A. Hernández on 11/12/20.
  6. //
  7. import Foundation
  8. import Combine
  9. // TAKEN FROM https://www.donnywals.com/implementing-an-infinite-scrolling-list-with-swiftui-and-combine/
  10. /*
  11. class ContentDataSource: ObservableObject {
  12. @Published var items = [Flower]() // ListItem
  13. @Published var isLoadingPage = false
  14. private var currentPage = 1
  15. private var canLoadMorePages = true
  16. init() {
  17. print("More 0")
  18. loadMoreContent()
  19. }
  20. func loadMoreContentIfNeeded(currentItem item: FlowerItem?) {
  21. guard let item = item else {
  22. print("More 1")
  23. loadMoreContent()
  24. return
  25. }
  26. let thresholdIndex = items.index(items.endIndex, offsetBy: -5)
  27. if items.firstIndex(where: { $0.id == item.id }) == thresholdIndex {
  28. print("More 2")
  29. loadMoreContent()
  30. }
  31. }
  32. private func loadMoreContent() {
  33. guard !isLoadingPage && canLoadMorePages else {
  34. print("Terminate \(isLoadingPage) \(canLoadMorePages)")
  35. return
  36. }
  37. isLoadingPage = true
  38. let url = URL(string: "https://trefle.io/api/v1/plants/?token=hg6M-l4XhrgVgn2A-qZC6KKMrVPMUuCffVfDgDPtc0I&page=\(currentPage)")!
  39. // https://s3.eu-west-2.amazonaws.com/com.donnywals.misc/feed-\(currentPage).json
  40. URLSession.shared.dataTaskPublisher(for: url)
  41. .map(\.data)
  42. .decode(type: TrefleResponseModel.self, decoder: JSONDecoder()) // ListResponse.self
  43. .receive(on: DispatchQueue.main)
  44. .handleEvents(receiveOutput: { response in
  45. print("Called, \(response.links!["self"] != response.links!["last"])")
  46. self.canLoadMorePages = (response.links!["self"] != response.links!["last"]) // response.hasMorePages
  47. self.isLoadingPage = false
  48. self.currentPage += 1
  49. })
  50. .map({ response in
  51. return self.items + response.data! // response.items
  52. })
  53. .catch({ _ in
  54. return Just(self.items)
  55. })
  56. .assign(to: &$items)
  57. }
  58. }
  59. */