swift - Reactive Cocoa swift 3.0 上的内存泄漏

标签 swift cocoa memory-leaks swift3 reactive-cocoa

我是 Reactive Cocoa for Swift 的新手,正在尝试为我的 Web 服务调用创建自定义信号。 我在探查器上遇到内存泄漏,但是我不知道在哪里处理信号以避免泄漏。

public func GetGroups() -> Signal<[GroupModel], SError>? {

        let accToken:String? = KeychainWrapper.standard.string(forKey: "access_token")
        let headers = ["Authorization":"Bearer " + accToken!]

        let signal = Signal<[GroupModel],SError>({(obs:Observer<[GroupModel],SError>) -> Disposable?
            in
            Alamofire.request(serverUrl+"/api/group/groups",method:HTTPMethod.get,parameters:nil,encoding:URLEncoding.default,headers:headers)
            .responseArray(completionHandler: {(data:DataResponse<[GroupModel]>) -> Void in

                if data.error != nil{

                   //handle error

                }else{
                    obs.send(value: data.result.value!)
                }


            })
            return nil
        })

        return signal;

    }

这就是我调用该服务的方式。

_ = groupService.GetGroups()?
            .observeResult{
            self.dataSource = $0.value
            self.collectionView?.reloadData()


        }

最佳答案

通常,您应该使用 SignalProducer 而不是 Signal 来发出网络服务事件。

您的代码中有两个主要问题。

  • 在您的信号实现中,您的信号将来不会完成,这意味着您的观察者将始终存在,这会导致内存泄漏。
  • 在你的观察 block (作为观察者)中,直接使用的self将被捕获在strong中,如上所述,你的观察者将在那里,这样 self 无法以正确的方式释放。

关于swift - Reactive Cocoa swift 3.0 上的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41828426/

相关文章:

ios - Xcode 8 beta 6 中的 Swift header 问题

ios - 顺序后台获取请求 iOS 7

c - 想了解内存泄漏的不同场景

iphone - 多次旋转后我的应用程序崩溃

arrays - 更改数组中结构的值

ios - 如何使用 Sprite Kit 更改背景颜色

ios - 如何使 UIPageControl 在屏幕底部重叠主页指示器

objective-c - 在 NSDocument 架构中打开文档之前进行验证

cocoa - NSDataDetector 识别的所有 tld 是什么?

c - tokyabinet 列表中的内存泄漏