如何在Service和Viewcontroller之间进行通信?

时间:2016-10-08 05:33:11

标签: ios swift firebase

我对iOS和快速开发都很陌生。很多swift + firebase教程,firebase的东西(例如身份验证,获取和保存数据)是在ViewController中完成的。就我学习迅速而言,这直接导致了“大规模视图控制器”的问题。在一些教程中,他们使用类似“DataService.swift”的类,并将它们作为单例访问:

class DataService {

   static let dataService: DataService = DataService()

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

但是当这些类与视图控制器完成时,它们之间没有通信。创建用户。让我更具体一点。我想它应该是这样的:

  1. 用户点击登录按钮。
  2. 然后,ViewController调用dataService.createUser(user)来处理登录内容并将用户数据保存到firebase。
  3. 如果它已经完成,它应该与视图控制器通信,它已经完成。
  4. ViewController检查createUser()的结果,并将用户导航到另一个视图。
  5. 我该怎么做?目前我正在使用委托模式。这是处理这些东西的好方法吗?

1 个答案:

答案 0 :(得分:0)

你可以这样做:

// 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.
        }
    }
}

顺便说一句,尽可能避免实现Singleton类。这种实现可能会让你很难进行一些单元测试。

关于您对“大规模视图控制器”的关注,您可以考虑模块化您的项目。但是现在,我认为体验这个“MVC”问题比避免它更好。