2016-08-16 86 views
1

我想避免在每个UIViewControllerlet APIHelper = API(),而不是我这样做:类实例的所有ViewControllers

extension UIViewController { 
    func APIHelper() -> API { 
    let api = API() 
    return api 
    } 
} 

,现在它正在像self.APIHelper().callMethod(),但我真的不知道,如果事情是这样的去做吧。有关最佳实践的任何提示?

+2

如何某种基本视图控制器的地方,你可以用这个声明扩展?这样,即使你不需要它,你所有的视图控制器都有这个功能。 – Miknash

+1

像APIViewController类:UIViewController {让APIHelper = API()} – JuicyFruit

+1

是的,类似的东西。当你需要它的时候,你只需要继承那个视图控制器。 – Miknash

回答

2

您的分机无用的,因为它只是与调用API()每次

self.APIHelper().callMethod() 
self.APIHelper().callSecondMethod() //here you created another API instance 

一样

API().callMethod() 
API().callSecondMethod() 

如果API是singletone,想法看起来不错,但在迅疾你通常会创建带静态常数的singletone:

class API { 
    static let sharedAPI = API() 
    //... 
} 

并获得这样的:

API.sharedAPI.callMethod() 
API.sharedAPI.callSecondMethod() //now called in same API instance 

如果你不想写API.sharedAPI每次,那么你可以使用:

您的扩展

extension UIViewController { 
    var apiHelper: API {return API.sharedAPI} 
} 

不推荐@NickCatib解释。

基本视点控制器

如@NickCatib建议(更容易与变量):

class BaseViewController: UIViewController { 
    // some of the code you might need 
    let apiHelper = API.sharedAPI 
} 

协议

如果使用API​​在视图控制器不时,可以是更好地宣布协议

protocol APIHelper { 
    var apiHelper: API {get} 
} 

与默认实现

extension APIHelper { 
    var apiHelper: API {return API.sharedAPI} 
} 

,并仅在需要时

class ViewControllerThatNeedsAPI: UIViewController, APIHelper { 
    // apiHelper avalible here 
} 

与所有三个方面,它连接到您的viewController您访问API是这样的:

apiHelper.callMethod() 
+0

只是一个简单的说明 - 单身人士确实让你感觉最终会改变的变量,否则它是矫枉过正的 - 它应该是静态类。 – Miknash

+0

@NickCatib“静态类” - 你是指类,不能有实例?你知道它的任何实现吗?或者,如果你的意思是“静态类”,没有任何存储属性的类,所以实际上所有的实例都是相同的 - 然后OP可以在任何地方使用“API()”,但是我认为singletone比许多平等实例更好。 –

+0

静态类是所有她的属性和方法都是静态的类 - 所以你有基本的URL设置一次,就是这样,你不需要存储任何动态的东西。它实际上会像这样:Service.API()。 – Miknash

1

如何使用该声明扩展某种基本视图控制器?这样,即使你不需要它,你所有的视图控制器都有这个功能。

这会是这样

class BaseViewController: UIViewController { 
    // some of the code you might need 
    func APIHelper() -> API { 
    let api = API() 
    return api 
    } 
} 

及更高版本:

class ViewControllerThatNeedsAPI : BaseViewController { 
    // You have it here 
} 

,我实际使用是有API调用服务/管理器处理的是,并发送所需的所有数据的另一种方法通过委托/ NSNotification /完成处理程序。这样你的代码就会更干净,更容易测试(如果你练习测试的话)。如果你把所有东西放在视图控制器中,你将会破坏SRP。这些经理是PONSO - Plain旧ns对象。您可以使用与视图控制器相同的方式,并使用一些带有API URL的BaseService,需要重写的基本内容等。之后,您只需实现服务并在需要时调用它,具体取决于实现方式是否具有将数据反映到UI。

相关问题