Skip to content

创建通用的APIService层

在构建现代应用程序时,网络请求是不可或缺的一部分。创建一个通用的APIService层可以帮助你更好地管理和组织网络请求。以下是构建APIService层的几个关键步骤:

1. 定义APIService协议

首先,定义一个协议来描述APIService的基本功能。这可以确保你的服务层具有一致性和可扩展性。

swift
protocol APIService {
    func fetchData<T: Decodable>(from endpoint: Endpoint, completion: @escaping (Result<T, Error>) -> Void)
}

2. 实现APIService

接下来,创建一个类来实现这个协议。这个类将负责处理所有的网络请求。

swift
class DefaultAPIService: APIService {
    func fetchData<T: Decodable>(from endpoint: Endpoint, completion: @escaping (Result<T, Error>) -> Void) {
        guard let url = endpoint.url else {
            completion(.failure(NetworkError.invalidURL))
            return
        }
        
        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            if let error = error {
                completion(.failure(error))
                return
            }
            
            guard let data = data else {
                completion(.failure(NetworkError.noData))
                return
            }
            
            do {
                let decodedData = try JSONDecoder().decode(T.self, from: data)
                completion(.success(decodedData))
            } catch {
                completion(.failure(error))
            }
        }
        task.resume()
    }
}

3. 定义网络错误

为了处理网络请求中的错误,定义一个自定义错误类型。这将使错误处理更加清晰。

swift
enum NetworkError: Error {
    case invalidURL
    case noData
    case decodingError
}

4. 使用APIService

在你的视图模型或控制器中,你可以轻松地使用APIService来发起网络请求。以下是一个示例:

swift
class MyViewModel: ObservableObject {
    private let apiService: APIService
    
    @Published var data: MyDataType?
    @Published var errorMessage: String?
    
    init(apiService: APIService = DefaultAPIService()) {
        self.apiService = apiService
    }
    
    func loadData() {
        apiService.fetchData(from: MyEndpoint.example) { [weak self] (result: Result<MyDataType, Error>) in
            switch result {
            case .success(let data):
                DispatchQueue.main.async {
                    self?.data = data
                }
            case .failure(let error):
                DispatchQueue.main.async {
                    self?.errorMessage = error.localizedDescription
                }
            }
        }
    }
}

5. 依赖注入

为了提高可测试性和灵活性,可以使用依赖注入来传递APIService的实例。这使得在单元测试中模拟网络请求变得更加容易。

swift
let mockService = MockAPIService()
let viewModel = MyViewModel(apiService: mockService)

通过以上步骤,你可以创建一个强大且灵活的APIService层,帮助你高效地管理网络请求。🎉 这种结构不仅提高了代码的可读性,还增强了可维护性。继续探索和实践,你会发现更多的可能性!🚀

本站使用 VitePress 制作