【问题标题】:Memory leak on Reactive Cocoa swift 3.0Reactive Cocoa swift 3.0 上的内存泄漏
【发布时间】:2017-06-09 06:23:00
【问题描述】:

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

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()


        }

【问题讨论】:

    标签: swift cocoa memory-leaks swift3 reactive-cocoa


    【解决方案1】:

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

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

    • 在你的信号实现中,你的signal 将来不会完成,这意味着你的观察者会一直在那里,这会导致你的内存泄漏。
    • 在你的observe块中(作为observer),直接使用的self会被捕获到strong中,如上所说你的observer会在那里,这样self就不能在dealloc中正确的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-11
      • 2010-12-01
      • 2013-05-16
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 2010-11-20
      • 2013-11-24
      相关资源
      最近更新 更多