我们有一个WebService单例,可以处理我们所有的API调用。除非我们一次从不同的ViewControllers进行多个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调用了Web服务并传递了其指针VCBf1,这与VCAF1(不同的功能或代码块在一起),但是您的serviceResponse并没有受到困扰,因为它只是忘记了它的早期值并开始保存VCBf1。
现在,您的第一个服务调用响应到达,并且您的代码说,执行我在serviceResponse中保存引用的代码。da !!!错误:)您正在执行错误的代码:)
解决方案
老实说,我没有发现设计中的任何问题,但是然后我可能是错的:)为Web服务创建单例类是非常常用的方法,闭包与ObjectiveC中的块没有什么不同,并且我对单例设计模式从未遇到过任何问题我作为iOS开发人员的职业生涯:)
所有你需要做的
删除变量serviceResponse
修改函数以使用函数争论而不是实例属性
func callWebserviceWith(paramsDict: NSDictionary, sendAccessToken: Bool, onCompletion: ServiceResponse) -> Void {
//when done use funtion arguement passed :)
onCompletion()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句