2016-07-20 6 views
2

友人!、私は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 
    } 

} 
  1. RestClient.swift - APIリクエストを作成し、JSON出力を渡します。このクラスには、ネットワークGET/POSTリクエストに関連するすべてのコードが含まれています。私は将来他のクラスに影響を与えることなくこのクラスを変更できます。
  2. HttpUser.swift - json出力を取得してユーザー配列を作成し、渡します。このクラスはネットワーク要求を気にしません。 はJSONレスポンスを処理し、それをオブジェクト配列に解析します。私はこれらの複数を持っています。 (例:HttpBlogs、HttpComments)
  3. UserViewController.swift - ユーザーを取得して、テーブルビューを配列して入力します。これは、UIに関連する部分だけをで処理します。

このアプローチは良いと言えますか? これを達成するにはもっと良い方法がありますか?

ありがとうございます!

- 注意:この場合、Alamofireのようなサードパーティのライブラリは使用しません。

+1

私はiOS開発にはかなり新しいですが、私の意見ではあなたのアプローチはとても良いです。実際に私は最初のプロジェクトを開発するときと同じアプローチを考え出しました。少しのアドバイス - あなたの代理変数を弱い変数として宣言してください。 – Elena

+0

ありがとう!私は今日、私のアプリケーションでこのコードを試しました。それはかなりきれいに見えます。 :P –

答えて

1

一般に、これは良いアプローチです。ユーザーエクスペリエンスを向上させるために、ユーザーインターフェイスにエラー(例:インターネット接続なし)を表示することを検討することをお勧めします。あなたの例では、RestClientクラスでエラーを処理していますが、エラーが発生した場合は、ユーザインターフェイスで処理するクラスがUserViewControllerにアップストリームされていません。

この記事では、独自のネットワークライブラリを作成する方法を詳しく説明しました。 http://ilya.puchka.me/networking-in-swift/

関連する問題