多个 ViewController 的一个网络处理程序 class
One network handler class for multiple ViewControllers
我有一个应用程序有 5 个不同的视图控制器,可通过 UITabBar 访问。
这些 ViewController 中的每一个都将通过取自同一 API 源的 5 个不同 URL 访问 API 数据。
如何重新使用下面的 API 请求代码,这样我就不必在我的代码中重新输入此块 5 次?下面的代码是我当前的设置,委托是第一个视图控制器。
protocol ClubFixturesManagerDelegate {
func didUpdateTable (club: [ClubData])
func didFailWithError(error: Error)
}
struct MyClubFixturesManager{
let getclubListURL = "someURL"
var delegate: ClubFixturesManagerDelegate?
func getClubID(clubID: String){
let getClubResultsURL = "someURL"
performRequest(with: getClubResultsURL)
}
func performRequest(with urlString: String){
if let url = URL(string: urlString){
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("APIToken", forHTTPHeaderField: "Authorization")
//create URL session
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
if error != nil{
self.delegate?.didFailWithError(error: error!)
return
}
if let safeData = data {
if let clubResults = self.parseJSON(safeData){
self.delegate?.didUpdateTable(club: clubResults)
}
}
}
task.resume()
}
}
func parseJSON(_ teamData: Data) -> [ClubData]?{
let decoder = JSONDecoder()
do{
var clubInfo: [ClubData] = []
let decodedData = try decoder.decode(ClubSeasonData.self, from: teamData)
for entry in decodedData.matches{
let updatedDate = ISO8601Converter.converter(for: entry.utcDate)
let clubInstance = ClubData(utcDate: updatedDate, homeTeam: entry.homeTeam.name, awayTeam: entry.awayTeam.name, homeTeamScore: entry.score.fullTime.homeTeam ?? nil, awayTeamScore: entry.score.fullTime.awayTeam ?? nil)
clubInfo.append(clubInstance)
}
return clubInfo
}
catch{
print(error)
}
return nil
}
}
我不知道您的完整设置,但我建议您将此 MyClubFixturesManager 结构保存在它自己的文件中。
然后将 "static" 添加到它的每个属性和函数中。
static func performRequest(with urlString: String)
然后尝试从您设置的每个 VC 中调用此
MyClubFixturesManager.performRequest(with urlString: urlString)
虽然不确定它如何与您的代表一起工作。另一种选择是在每个 VC 中创建此结构的实例。希望这能引导您走上正确的道路。
您只需在 viewDidLoad 中创建 api 管理器的新实例,然后分配委托并执行请求。
像这样:
var apiManager: MyClubFixturesManager?
func viewDidLoad() {
super.viewDidLoad()
apiManager = MyClubFixturesManager()
apiManager.delegate = self // Assuming self conforms to ClubFixturesManagerDelegate protocol
apiManager?.performRequest(with: "yourUrl")
}
作为旁注,我会让委托变弱以避免保留周期和内存泄漏。
你只需要做这样的事情:
weak var delegate: ClubFixturesManagerDelegate?
为此,您需要使协议 class 绑定:
protocol ClubFixturesManagerDelegate: class {
func didUpdateTable (club: [ClubData])
func didFailWithError(error: Error)
}
我有一个应用程序有 5 个不同的视图控制器,可通过 UITabBar 访问。
这些 ViewController 中的每一个都将通过取自同一 API 源的 5 个不同 URL 访问 API 数据。
如何重新使用下面的 API 请求代码,这样我就不必在我的代码中重新输入此块 5 次?下面的代码是我当前的设置,委托是第一个视图控制器。
protocol ClubFixturesManagerDelegate {
func didUpdateTable (club: [ClubData])
func didFailWithError(error: Error)
}
struct MyClubFixturesManager{
let getclubListURL = "someURL"
var delegate: ClubFixturesManagerDelegate?
func getClubID(clubID: String){
let getClubResultsURL = "someURL"
performRequest(with: getClubResultsURL)
}
func performRequest(with urlString: String){
if let url = URL(string: urlString){
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("APIToken", forHTTPHeaderField: "Authorization")
//create URL session
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
if error != nil{
self.delegate?.didFailWithError(error: error!)
return
}
if let safeData = data {
if let clubResults = self.parseJSON(safeData){
self.delegate?.didUpdateTable(club: clubResults)
}
}
}
task.resume()
}
}
func parseJSON(_ teamData: Data) -> [ClubData]?{
let decoder = JSONDecoder()
do{
var clubInfo: [ClubData] = []
let decodedData = try decoder.decode(ClubSeasonData.self, from: teamData)
for entry in decodedData.matches{
let updatedDate = ISO8601Converter.converter(for: entry.utcDate)
let clubInstance = ClubData(utcDate: updatedDate, homeTeam: entry.homeTeam.name, awayTeam: entry.awayTeam.name, homeTeamScore: entry.score.fullTime.homeTeam ?? nil, awayTeamScore: entry.score.fullTime.awayTeam ?? nil)
clubInfo.append(clubInstance)
}
return clubInfo
}
catch{
print(error)
}
return nil
}
}
我不知道您的完整设置,但我建议您将此 MyClubFixturesManager 结构保存在它自己的文件中。
然后将 "static" 添加到它的每个属性和函数中。
static func performRequest(with urlString: String)
然后尝试从您设置的每个 VC 中调用此
MyClubFixturesManager.performRequest(with urlString: urlString)
虽然不确定它如何与您的代表一起工作。另一种选择是在每个 VC 中创建此结构的实例。希望这能引导您走上正确的道路。
您只需在 viewDidLoad 中创建 api 管理器的新实例,然后分配委托并执行请求。 像这样:
var apiManager: MyClubFixturesManager?
func viewDidLoad() {
super.viewDidLoad()
apiManager = MyClubFixturesManager()
apiManager.delegate = self // Assuming self conforms to ClubFixturesManagerDelegate protocol
apiManager?.performRequest(with: "yourUrl")
}
作为旁注,我会让委托变弱以避免保留周期和内存泄漏。 你只需要做这样的事情:
weak var delegate: ClubFixturesManagerDelegate?
为此,您需要使协议 class 绑定:
protocol ClubFixturesManagerDelegate: class {
func didUpdateTable (club: [ClubData])
func didFailWithError(error: Error)
}