18. 15
模擬 login API ⾏行行為
protocol LoginAPIDelegate {
func loginToken(token:String?,callback:@escaping loginAPICompletion)
}
extension API:LoginAPIDelegate{
func loginToken(token:String?,callback:@escaping loginAPICompletion{
// call real API here
}
}
19. 16
模擬 Facebook SDK response ⾏行行為
protocol FBLoginManagerDelegate {
var currentAccessToken:String? { get }
……
}
class FBLogInManager:FBLoginManagerDelegate {
var currentAccessToken:String? {
return FBSDKAccessToken.current()?.tokenString
}
……
}
20. 17
class LoginManager{
static let shareInstance = LoginManager()
weak var delegate:LoginManagerDelegate?
private var loginAPI:LoginAPIDelegate
private let accountKit:AccountKitDelegate
private let fb:FBLoginManagerDelegate
init(api:LoginAPIDelegate = API.shareInstance,
ac:AccountKitDelegate = AKFAccountKit(responseType: .accessToken),
fblogin:FBLoginManagerDelegate = FBLogInManager()) {
self.loginAPI = api
self.accountKit = ac
self.fb = fblogin
}
}
Real Instance
26. 23
class LoginManager{
static let shareInstance = LoginManager()
weak var delegate:LoginManagerDelegate?
private var loginAPI:LoginAPIDelegate
private let accountKit:AccountKitDelegate
private let fb:FBLoginManagerDelegate
init(api:LoginAPIDelegate = API.shareInstance,
ac:AccountKitDelegate = AKFAccountKit(responseType: .accessToken),
fblogin:FBLoginManagerDelegate = FBLogInManager()) {
self.loginAPI = api
self.accountKit = ac
self.fb = fblogin
}
}
Real Instance
27. 24
struct LoginManagerInject{
var loginAPI:KTLoginAPIDelegate = KTAPI.shareInstance
var accountKit:KTAccountKitDelegate = AKFAccountKit(responseType: .accessTok
var fb:KTFBLoginManagerDelegate = FBLogInManager()
}
class LoginManager{
static let shareInstance = LoginManager()
weak var delegate:LoginManagerDelegate?
private let inject:LoginManagerInject
init(inject:LoginManagerInject = LoginManagerInject() ){
self.inject = inject
}
}
28. 24
struct LoginManagerInject{
var loginAPI:KTLoginAPIDelegate = KTAPI.shareInstance
var accountKit:KTAccountKitDelegate = AKFAccountKit(responseType: .accessTok
var fb:KTFBLoginManagerDelegate = FBLogInManager()
}
class LoginManager{
static let shareInstance = LoginManager()
weak var delegate:LoginManagerDelegate?
private let inject:LoginManagerInject
init(inject:LoginManagerInject = LoginManagerInject() ){
self.inject = inject
}
}
self.loginAPI
29. 24
struct LoginManagerInject{
var loginAPI:KTLoginAPIDelegate = KTAPI.shareInstance
var accountKit:KTAccountKitDelegate = AKFAccountKit(responseType: .accessTok
var fb:KTFBLoginManagerDelegate = FBLogInManager()
}
class LoginManager{
static let shareInstance = LoginManager()
weak var delegate:LoginManagerDelegate?
private let inject:LoginManagerInject
init(inject:LoginManagerInject = LoginManagerInject() ){
self.inject = inject
}
}
self.injec.loginAPIself.loginAPI
31. 26
User
UserInfo
UserSetting
User Info save in memory
Ex:User ID, Member Ship
User Setting save in NSUserDefault
Ex:IsShowXXPage
When UserInfo change , some UserSetting Variable also change
Requirement
AppDelegate
32. 27
class UserInfo {
private var userSetting:UserSettingDelegate
init(userSetting:UserSettingDelegate = shareAppDelegate.user.setting){
self.userSetting = userSetting
}
}
User UserInfoAppDelegat
User UserSettingAppDelegate
33. 28
class UserInfo {
private var userSetting:UserSettingDelegate
init(userSetting:UserSettingDelegate = shareAppDelegate.user.setting){
self.userSetting = userSetting
}
}
User UserInfoAppDelegat
User
UserSetting
AppDelegate
UserInfo
34. 29
class UserInfo {
private var userSetting:UserSettingDelegate
init(userSetting:UserSettingDelegate = shareAppDelegate.user.setting){
self.userSetting = userSetting
}
}
User UserInfoAppDelegat
User
UserSetting
AppDelegate
UserInfo
User UserSettingAppDelegate
35. 30
class UserInfo:{
private var injectFunc:()->UserSetting
private var setting:UserSetting {
return self.injectFunc()
}
init(injectFunc:@escaping ()->UserSetting =
{return shareDelegate.user.setting}){
self.injectFunc = injectFunc
}
}
36. 30
class UserInfo:{
private var injectFunc:()->UserSetting
private var setting:UserSetting {
return self.injectFunc()
}
init(injectFunc:@escaping ()->UserSetting =
{return shareDelegate.user.setting}){
self.injectFunc = injectFunc
}
}
stored property
37. 30
class UserInfo:{
private var injectFunc:()->UserSetting
private var setting:UserSetting {
return self.injectFunc()
}
init(injectFunc:@escaping ()->UserSetting =
{return shareDelegate.user.setting}){
self.injectFunc = injectFunc
}
}
stored property
computed property
38. 30
class UserInfo:{
private var injectFunc:()->UserSetting
private var setting:UserSetting {
return self.injectFunc()
}
init(injectFunc:@escaping ()->UserSetting =
{return shareDelegate.user.setting}){
self.injectFunc = injectFunc
}
}
self.setting
stored property
computed property