IOS - 委托与通知

时间:2014-12-25 12:07:16

标签: ios swift login delegates nsnotifications

想就以下架构发表意见:

在我的应用程序中,我有一个处理异步登录的静态类(LoginManager)。登录阶段完成后,应用程序应响应并转换到另一个状态。

我有2个实施建议

  1. 使用代表:

    import Foundation
    
    protocol LoginManagerDelegate{
        func onLogin(result:AnyObject)
    }
    
    class LoginManager {
        struct Wrapper {
            static var delegate:LoginManagerDelegate?
        }
    
        class func userDidLogin(result){            
             Wrapper.delegate?.onLogin(result)
        }
    
    }
    
  2. 使用通知:

    import Foundation
    
    class LoginManager {
    
        class func userDidLogin(result){            
             NSNotificationCenter.defaultCenter().postNotificationName("onLogin", object: result)
        }
    
    }
    
  3. :什么是最好的方法?

4 个答案:

答案 0 :(得分:8)

如果

  

func onLogin(结果:AnyObject)

仅在一个课程中实施,我会选择委托。更适合 1对1关系

如果是 1到n关系,我会选择通知

我不喜欢依赖Notification(个人品味),所以我经常处理AppDelegate中的登录/注销转换,这允许我使用Delegate模式。

答案 1 :(得分:6)

对于

  1. 代表/协议
  2. 通常在您想要从当前视图控制器更新或完成上一个控制器中的任何过程时使用。因此,如果要更新先前视图控制器中的值,则最好使用委托/协议。

    所以它基本上是一对一的关系。

    1. 通知
    2. 当您想要从任何其他viewcontroller更新视图控制器中的值时,通常会使用它。所以它基本上是一对一的关系。

      因此请根据您的要求使用此类型。

      也许这会对你有帮助。

答案 2 :(得分:1)

3:回调函数。 (比如1,但没有专门为此目的宣布协议的方法)。

class LoginManager {
    // using this singleton makes me feel dirty
    struct Wrapper {
        // this AnyObject too...
        static var callback: ((result: AnyObject)->())?
    }

    class func userDidLogin(result){            
         Wrapper.callback?(result)
    }
}

答案 3 :(得分:0)

我会选择代理实现完成块。顺便说一句,作为一种良好的做法,不应将NSNotification用于过渡。 更好地使用代表。