我们有一个WebService单例来处理我们所有的API调用。除非我们同时从不同的ViewController调用多个API,否则所有方法都可以正常工作。

  • VCA发送请求A
  • VCB发送请求B
  • 响应B返回到VCB
  • 响应A返回到VCA-这将导致
  • 异常

    网络服务:
    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开发人员的职业生涯:)

    所有你需要做的
  • 删除变量serviceResponse
  • 修改函数以使用函数争论而不是实例属性

  • func callWebserviceWith(paramsDict: NSDictionary, sendAccessToken: Bool, onCompletion: ServiceResponse) -> Void {
        //when done use funtion arguement passed :)
        onCompletion()
    }
    

    08-19 03:22