一个网络处理程序类,用于多个ViewController。

问题描述 投票:0回答:1

我有一个应用程序,它有5个不同的视图控制器,通过一个UITabBar访问。

这些ViewControllers中的每一个都将通过5个来自同一API源的不同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

        }

}
swift xcode api delegates viewcontroller
1个回答
0
投票

你可以简单地在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?

要做到这一点,你需要将协议类进行绑定。

protocol ClubFixturesManagerDelegate: class {

    func didUpdateTable (club: [ClubData])
    func didFailWithError(error: Error) 
}

0
投票

我不知道你的完整设置 但我建议如果你还没有的话 把这个MyClubFixturesManager结构保存在它自己的文件里

然后在它的每个属性和函数中添加 "static"。

static func performRequest(with urlString: String)

然后尝试从您设置的每个VC中调用这个结构。

MyClubFixturesManager.performRequest(with urlString: urlString)

但不确定它对你的委托人有什么作用。另一个选择是在每个VC中创建一个该结构的实例。希望这能让你走上正确的道路。

© www.soinside.com 2019 - 2024. All rights reserved.