IGListKit/Examples/Examples-iOS/IGListKitExamples/Models/APIService.swift

73 lines
2.4 KiB
Swift
Raw Normal View History

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import Foundation
// MARK: - Data Provider
// In IGListKit architecture, the data provider is separated from the UI components
// This enables clean separation of concerns and makes testing easier
class APIService {
static let shared = APIService()
// Pagination state
private var currentPage = 1
private var isLoading = false
private var hasMoreData = true
// Fetch posts with pagination support
// This is called by the view controller to load data
// IGListKit will handle the diffing and UI updates based on the results
func fetchPosts(completion: @escaping ([Post]) -> Void) {
guard !isLoading, hasMoreData else { return }
self.isLoading = true
// Simulate network delay
DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
let posts = self.generateMockPosts(page: self.currentPage)
if self.currentPage >= 5 {
self.hasMoreData = false
}
self.currentPage += 1
self.isLoading = false
DispatchQueue.main.async {
completion(posts)
}
}
}
// Reset pagination state for refreshing
func resetPagination() {
self.currentPage = 1
self.hasMoreData = true
}
// Generate mock data for the demo app
// In a real app, this would be replaced with API calls
func generateMockPosts(page: Int) -> [Post] {
let baseCount = (page - 1) * 5
return (1...5).map { index in
let id = "\(baseCount + index)"
return Post(
id: id,
username: "user\(Int.random(in: 100...999))",
userAvatarURL: URL(string: "https://randomuser.me/api/portraits/men/\(Int.random(in: 1...99)).jpg"),
imageURL: URL(string: "https://picsum.photos/id/\(baseCount + index + 10)/500/500"),
title: "Post #\(id)",
description: "This is a beautiful photo I took while traveling. What do you think? #travel #photography #nature",
likes: Int.random(in: 10...1000),
timeStamp: Date().addingTimeInterval(-Double(Int.random(in: 1...86400) * (baseCount + index)))
)
}
}
}