2016-10-08 3 views
0

Я довольно новичок в iOS и быстро развиваюсь. Множество обучающих программ быстрой + firebase там, материал firebase (например, аутентификация, выборка и сохранение данных) выполняется в ViewController. Насколько я понял, это ведет непосредственно к проблеме «Massive View Controllers». В некоторых учебных пособиях, которые они используют классы, как «DataService.swift» и доступ к ним как синглтон:Как связаться между Service и Viewcontroller?

class DataService { 

    static let dataService: DataService = DataService() 

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

НО эти классы не имеют никакой связи с контроллером зрения, когда они сделаны, например, с создавая пользователя. Позвольте мне быть более конкретным. Я думаю, это должно понравиться:

  1. User taps login button.
  2. Затем ViewController вызывает dataService.createUser (пользователь), который обрабатывает данные входа и сохраняет данные пользователя в firebase.
  3. Если он закончен, он должен связаться с контроллером представления, чтобы он был готов.
  4. ViewController проверяет результат createUser() и переводит пользователя в другое представление.

Как я могу это сделать? На данный момент я использую шаблон делегирования. Это хороший способ справиться с этим?

+0

вам необходимо использовать методы-делегаты для связи между viewControllers и singleton. – Dravidian

+0

Существует несколько способов, которыми вы можете справиться. Вы можете использовать NotificationCenter для отправки сообщений о событиях в вашем приложении, вы могли бы использовать вышеупомянутые шаблоны делегатов/протоколов, вы могли бы добавлять блоки завершения, когда это необходимо, и т. Д. Вопрос слишком широк, чтобы дать прямой ответ - я бы предложил исследовать каждую из этих определить, какой метод лучше всего подходит для ваших нужд, а затем задать конкретные вопросы об этом, если вы окажетесь застряли. – BJHStudios

ответ

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», чем избегать этого.

Смежные вопросы