完成处理程序如何返回错误的ViewController?

里昂

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

  1. VCA发送请求A
  2. VCB发送请求B
  3. 响应B返回到VCB
  4. 响应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

怎么会这样

桑迪普·班达里(Sandeep Bhandari)

问题不在于完成块,而是您处理它的方式:)

错误

您的单例ServiceResponse类具有一个名为serviceResponse的类变量,这意味着内存中将只有一个名为serviceResponse的变量(这是一个保存对函数指针的引用的指针变量)

var serviceResponse : ServiceResponse!

现在,当VCA进行调用时,它将其指针传递给代码块,让其调用VCAF1,现在您的serviceResponse将具有VCAF1的值,假设您的Web服务尚未完成,并且VCB调用了Web服务并传递了其指针VCBf1,这与VCAF1(不同的功能或代码块在一起),但是您的serviceResponse并没有受到困扰,因为它只是忘记了它的早期值并开始保存VCBf1。

现在,您的第一个服务调用响应到达,并且您的代码说,执行我在serviceResponse中保存引用的代码。da !!!错误:)您正在执行错误的代码:)

解决方案

老实说,我没有发现设计中的任何问题,但是然后我可能是错的:)为Web服务创建单例类是非常常用的方法,闭包与ObjectiveC中的块没有什么不同,并且我对单例设计模式从未遇到过任何问题我作为iOS开发人员的职业生涯:)

所有你需要做的

  1. 删除变量serviceResponse

  2. 修改函数以使用函数争论而不是实例属性

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用完成处理程序正确消除模式ViewController

来自分类Dev

如何在完成处理程序中使用返回值?

来自分类Dev

返回内部事件完成的处理程序

来自分类Dev

从完成处理程序返回值

来自分类Dev

从完成处理程序返回值-Swift

来自分类Dev

从异步完成处理程序返回的 RXSwift flatmap

来自分类Dev

如何将“ C ++完成处理程序”传递给NSURLSessionDataTask来处理返回的数据?

来自分类Dev

Swift中的完成处理程序错误

来自分类Dev

完成处理程序在任务完成之前返回

来自分类Dev

如何为具有返回数据的完成处理程序的方法编写单元测试?

来自分类Dev

如何调用此完成处理程序?

来自分类Dev

如何制作与 nil 兼容的完成处理程序?

来自分类Dev

如何使用 MDCSnackbarMessage 完成处理程序?

来自分类Dev

从完成处理程序中调用返回父函数

来自分类Dev

Swift 2.0 Alamofire完成处理程序返回Json

来自分类Dev

等到完成处理程序结束返回BOOL吗?

来自分类Dev

异步完成处理程序中的返回值

来自分类Dev

NSURLSessionDataTask在完成处理程序Swift 2.0中返回数据

来自分类Dev

dispatch_async中的完成处理程序错误-可选展开

来自分类Dev

initPublisher 的完成处理程序

来自分类Dev

Swift:使用完成处理程序从另一个通知一个ViewController

来自分类Dev

UITransitionContextFromViewControllerKey返回错误的ViewController

来自分类Dev

UITransitionContextFromViewControllerKey返回错误的ViewController

来自分类Dev

如何返回Swift枚举以处理错误情况

来自分类Dev

如何处理从getter方法返回的错误?

来自分类Dev

如何存储关闭完成处理程序以供以后调用?

来自分类Dev

如何使用Lambda进行Boost Asio异步完成处理程序

来自分类Dev

迅速如何为此功能创建完成处理程序

来自分类Dev

如何使用以下完成处理程序调用函数?

Related 相关文章

  1. 1

    如何使用完成处理程序正确消除模式ViewController

  2. 2

    如何在完成处理程序中使用返回值?

  3. 3

    返回内部事件完成的处理程序

  4. 4

    从完成处理程序返回值

  5. 5

    从完成处理程序返回值-Swift

  6. 6

    从异步完成处理程序返回的 RXSwift flatmap

  7. 7

    如何将“ C ++完成处理程序”传递给NSURLSessionDataTask来处理返回的数据?

  8. 8

    Swift中的完成处理程序错误

  9. 9

    完成处理程序在任务完成之前返回

  10. 10

    如何为具有返回数据的完成处理程序的方法编写单元测试?

  11. 11

    如何调用此完成处理程序?

  12. 12

    如何制作与 nil 兼容的完成处理程序?

  13. 13

    如何使用 MDCSnackbarMessage 完成处理程序?

  14. 14

    从完成处理程序中调用返回父函数

  15. 15

    Swift 2.0 Alamofire完成处理程序返回Json

  16. 16

    等到完成处理程序结束返回BOOL吗?

  17. 17

    异步完成处理程序中的返回值

  18. 18

    NSURLSessionDataTask在完成处理程序Swift 2.0中返回数据

  19. 19

    dispatch_async中的完成处理程序错误-可选展开

  20. 20

    initPublisher 的完成处理程序

  21. 21

    Swift:使用完成处理程序从另一个通知一个ViewController

  22. 22

    UITransitionContextFromViewControllerKey返回错误的ViewController

  23. 23

    UITransitionContextFromViewControllerKey返回错误的ViewController

  24. 24

    如何返回Swift枚举以处理错误情况

  25. 25

    如何处理从getter方法返回的错误?

  26. 26

    如何存储关闭完成处理程序以供以后调用?

  27. 27

    如何使用Lambda进行Boost Asio异步完成处理程序

  28. 28

    迅速如何为此功能创建完成处理程序

  29. 29

    如何使用以下完成处理程序调用函数?

热门标签

归档