2017-01-24 11 views
0

Reactive Cocoa for Swiftの新機能で、Webサービスコール用のカスタム信号を作成しようとしています。 プロファイラでメモリリークが発生しましたが、リークを避けるためにどこにSignalを配置するのか分かりません。Reactive Cocoa swift 3.0のメモリリーク

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


     } 

答えて

0

一般的に、あなたは、ネットワーク・サービス・イベントを発するようにSignalProducerの代わりSignalを使用する必要があります。

コードには2つの主な問題があります。あなたのシグナルの実装では

  • 、あなたsignalはあなたのオブザーバーが常に存在し、これはあなたのメモリリークにつながることを意味しており、将来的には完成しません。
  • selfは、オブザーバーとして、直接にキャプチャされます。上記のように、オブザーバーがそこにいると言われているので、selfは正しい方法でデアロックできません。
関連する問題