我们有一个WebService单例来处理我们所有的API调用。除非我们同时从不同的ViewController调用多个API,否则所有方法都可以正常工作。
网络服务:
typealias ServiceResponse = (NSDictionary!, NSError!) -> ()
class WebService: NSObject {
var serviceResponse : ServiceResponse!
class var sharedInstance:WebService {
struct Singleton {
static let instance = WebService()
}
return Singleton.instance
}
func callWebserviceWith(paramsDict: NSDictionary, sendAccessToken: Bool, onCompletion: ServiceResponse) -> Void {
serviceResponse = onCompletion
怎么会这样
最佳答案
问题不在于完成块,而是您处理它的方式:)
错误
您的单例ServiceResponse类具有一个名为serviceResponse的类变量,这意味着内存中将只有一个名为serviceResponse的变量(这是一个保存对函数指针的引用的指针变量)
var serviceResponse : ServiceResponse!
现在,当VCA进行调用时,它将其指针传递给代码块,让其调用VCAF1,现在您的serviceResponse将具有VCAF1的值,假定您的Web服务尚未完成,并且VCB调用该Webservice并传递其指针VCBf1,这与VCAF1(不同的功能或代码块放在一起),但您的serviceResponse并不麻烦,因为它只是忘记了它的早期值并开始保存VCBf1。
现在,您的第一个服务调用响应到达,您的代码说,执行在serviceResponse中保存引用的代码。 da !!!!错误:)您正在执行错误的代码:)
解决方案
老实说,我没有发现设计中的任何问题,但是然后我可能是错的:)为Web服务创建单例类是非常常用的方法,闭包与ObjectiveC中的块没有什么不同,我对单例设计模式从未遇到过任何问题我作为iOS开发人员的职业生涯:)
所有你需要做的
func callWebserviceWith(paramsDict: NSDictionary, sendAccessToken: Bool, onCompletion: ServiceResponse) -> Void {
//when done use funtion arguement passed :)
onCompletion()
}