友人!、私はSwiftを初めて使っています。私は私のView Controllerの一つで複数の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
}
}
- RestClient.swift - APIリクエストを作成し、JSON出力を渡します。このクラスには、ネットワークGET/POSTリクエストに関連するすべてのコードが含まれています。私は将来他のクラスに影響を与えることなくこのクラスを変更できます。
- HttpUser.swift - json出力を取得してユーザー配列を作成し、渡します。このクラスはネットワーク要求を気にしません。 はJSONレスポンスを処理し、それをオブジェクト配列に解析します。私はこれらの複数を持っています。 (例:HttpBlogs、HttpComments)
- UserViewController.swift - ユーザーを取得して、テーブルビューを配列して入力します。これは、UIに関連する部分だけをで処理します。
このアプローチは良いと言えますか? これを達成するにはもっと良い方法がありますか?
ありがとうございます!
- 注意:この場合、Alamofireのようなサードパーティのライブラリは使用しません。
私はiOS開発にはかなり新しいですが、私の意見ではあなたのアプローチはとても良いです。実際に私は最初のプロジェクトを開発するときと同じアプローチを考え出しました。少しのアドバイス - あなたの代理変数を弱い変数として宣言してください。 – Elena
ありがとう!私は今日、私のアプリケーションでこのコードを試しました。それはかなりきれいに見えます。 :P –