Swift:网络请求的单独类

时间:2016-07-20 12:57:27

标签: ios swift post architecture get

朋友们!我是Swift的新手。我需要在我的一个视图控制器中发出多个API请求。如果我将所有代码放在ViewController中,它将会很混乱。 所以我试图开发这个简单的架构来分离概念,但我不确定它是否是处理这种情况的最佳方法。

/*-----------------------------------------------------*/
/* RestClient.swift */
/*-----------------------------------------------------*/
protocol RestClientDelegate {
    func dataDidLoad(json:String)
}
class RestClient {

    var delegate:RestClientDelegate

    //Handles all the network codes and exceptions
    func makeGetRequest(url){
        //send a get request to the server  
        //on error - handle erros 
        //on success - pass Json response to HttpUser class
        delegate.dataDidLoad(jsonOutput)
    }

}

/*-----------------------------------------------------*/
/* HttpUser.swift */
/*-----------------------------------------------------*/
protocol UserDelegate(){
    func usersDidLoad(usersArray:[User])//User object array
}
class HttpUser, RestClientDelegate {

    var delegate:UserDelegate

    func getUsers(){
        //Use rest client to make an api call
        var client = RestClient()
        client.delegate = self
        client.makeGetRequest("www.example.com/users")
    }

    //Once RestClient get the json string output, it will pass to
    //this function
    func dataDidLoad(json:String){
        //parse json - Handles json exceptions
        //populate user objects in an array
        //pass user array to the ViewController
        delegate.usersDidLoad(usersArray:[User])
    }

}

/*-----------------------------------------------------*/
/* UserViewController.swift */
/*-----------------------------------------------------*/
class UserViewController:UIViewController, UserDelegate {

    override viewDidLoad(){
        super.viewDidLoad()

        //Ask http user class to retrieve users
        var httpUser = HttpUser()
        httpUser.delegate = self
        httpUser.getUsers()
    }

    //Callback function to get users array
    func usersDidLoad(usersArray:[User]) {
        //now you have users object array
        //populate a table view
    }

}
  1. RestClient.swift - 发出API请求并传递json输出。此类包含与网络 GET / POST 请求相关的所有代码。我可以在将来修改这个类,而不会影响其他类。
  2. HttpUser.swift - 获取json输出制作用户数组并传递它。该类不关心网络请求。它只是处理JSON响应并将其解析为对象数组。我会有多个这些。 (例如:HttpBlogs,HttpComments)
  3. UserViewController.swift - 获取用户数组并填充表格视图。这只会处理与UI相关的部分
  4. 你能告诉我这种方法是否适合遵循? 有没有更好的方法来实现这一目标?

    非常感谢大家!

    - 请注意:在这种情况下,我不想使用像Alamofire这样的第三方库。

1 个答案:

答案 0 :(得分:1)

总的来说,这是一个很好的方法。您可能需要考虑在用户界面上显示错误(例如:无互联网连接)以获得更好的用户体验。在您的示例中,您正在RestClient类中处理错误,但是如果出现任何错误,则不会将UserViewController类置于用户界面上进行处理。