2016-10-08 5 views
0

私はiOSと迅速な開発にはかなり新しいです。そこに素早く+ firebaseのチュートリアルがたくさんあります。(認証、取得、保存など)はViewControllerで実行されます。私が習得した限りでは、これは「大量のView Controller」の問題に直接つながります。彼らは「DataService.swift」のようなクラスを使用してシングルトンとしてそれらにアクセスするいくつかのチュートリアルで:サービスとViewController間の通信方法

class DataService { 

    static let dataService: DataService = DataService() 

    func createUser(FIRUser: user) {} 
    ... 
} 

しかし、彼らは、例えばで行われているときに、これらのクラスは、ビューコントローラとの通信を持っていませんユーザーを作成します。私はもっ​​と具体的にしましょう。私はそれがこのようにすべきだと思います:

  1. ユーザータップログインボタン。
  2. 次に、ViewControllerは、ログイン情報を処理し、ユーザーデータをfirebaseに保存するdataService.createUser(user)を呼び出します。
  3. 終了した場合は、View Controllerと通信して終了してください。
  4. ViewControllerはcreateUser()の結果をチェックし、ユーザを別のビューに移動します。

どうすればいいですか?現時点で私は委任パターンを使用しています。これは、このようなことを処理する良い方法ですか?ただシングルトンクラスを実装避け、ところで

// User.swift 
struct User { 
    // Declare necessary properties. 
    // Such as firstName, lastName, email, etc. 
} 

// AuthenticationService.swift 
protocol AuthenticationService { 
    func createUser(user: User, completion: (Error?, User?) -> Void) 
} 

// AuthServiceProvider.swift 
class AuthServiceProvider: AuthenticationService { 

    func createUser(user: User, completion: (Error?, User?) -> Void) { 
     // Do the necessary work here. 
     // Convert user to an instance of 'FIRUser' if necessary. 
     // Use the completion block when you are done. 
    } 
} 

// RegisterViewController.swift 
class RegisterViewController: UIViewController { 

    var service = AuthServiceProvider()   

    @IBAction func didTapRegisterButton(sender: UIButton) { 
     var user = User() 
     // Fill the necessary properties to be included. 
     // Then call the 'createUser' function. 
     service.createUser(user: user) { (error, user) -> Void in 
      // This is where you are redirected upon completion. 
      // Handle always the error if there is. 
      // If there is none, navigate to your next scene/view. 
     } 
    } 
} 

、可能な限り:

+0

viewControllerとsingleton間の通信にdelegate-protocolメソッドを使用する必要があります。 – Dravidian

+0

これにはいくつかの方法があります。 NotificationCenterを使用してアプリケーション間でイベントメッセージを送信したり、前述のデリゲート/プロトコルパターンを使用したり、必要に応じて補完ブロックを追加したりすることができます。質問が広すぎて直接答えが得られません - どの方法があなたのニーズに最も適しているのかを判断し、自分が悩んでいる場合は、それについて具体的な質問をしてください。 – BJHStudios

答えて

0

あなたは、このようにそれを行うことができます。この種の実装は、単体テストを行うのに苦労するかもしれません。

"Massive View Controller"に関する懸念事項に関しては、プロジェクトのモジュール化について検討することができます。しかし、今、私はそれを回避するよりも、この "MVC"の問題を経験するほうがよいと提案します。

関連する問題