Max*_*Max 10 asynchronous ios swift
我有一个静态方法的类:这个类包装了对Twitter API的调用
在第二节课中,我有一些商业逻辑.
由于包装类中某些方法的异步行为,我很难设计通信.这就是我所做的:
APIManager.swift
public class APIManager {
class func getPermission(callback : () -> Void) {
let accountStore = ACAccountStore()
let accountType =
ACAccountStore().accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierTwitter)
let callbackRequestAccess = { (granted: Bool, error: NSError!) -> Void in
...
if(granted) {
callback()
}
}
accountStore.requestAccessToAccountsWithType(setAccountType,
options: nil, completion: callbackRequestAccess)
}
}
Run Code Online (Sandbox Code Playgroud)
Welcome.swift
public class Welcome {
public func checkPermission() {
APIManager.getPermission(getTweet)
}
public func getTweet() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定这个设计是否合适.我不想在这些类之间建立强大的联系,这就是我使用回调的原因.
这是经典设计吗?而且,我觉得这种行为不容易测试吗?
通过不使用类方法,您将大大提高可测试性.创建TwitterConnection协议.创建一个SystemTwitterConnection符合它并管理事物的东西ACAccountStore.创建一个TestTwitterConnection返回您可以配置用于测试的预设响应.如果Apple推出另一种存储这些帐户的方法,您甚至可以创建一个KeychainTwitterConnection手动管理Twitter登录而不使用ACAccountStore或其他一些实现.
将适当的连接传递给Welcome创建时.
如果TwitterConnection协议变大,你应该认真考虑拆分成更小的协议,如TwitterAuthenticator与TweetFetcher该处理的事情少(即使单一类型的实际实现所有这些协议).通过允许您的测试类型仅实现几个函数而不是几十个函数,这可以使测试更容易.
闭包的使用可能很好,但你应该更贴近Cocoa命名约定.callback传统上称之为你所称的是什么completion.我还会关注Cocoa在如何命名方法方面的领先优势.而不是getPermission(),它会requestAccessWithCompletionHandler().这将有助于调用者理解它具有非常类似的行为requestAccessToAccountsWithType(options:completion:).不要为调用者构建新的词汇表.
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |