2017-01-24 7 views
0

Я новичок в Reactive Cocoa для Swift и пытаюсь создать собственный сигнал для вызовов веб-сервисов. У меня есть утечка памяти на профилировщике, однако я не могу понять, где распоряжаться сигналом, чтобы избежать утечек.Утечка памяти на 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 испускать события сетевых услуг.

В ваших кодах есть две основные проблемы.

  • В вашей реализации сигнала, ваш signal не будет завершен в будущем, что означает, что ваш наблюдателя всегда будет там, это приводит к вашей утечке памяти.
  • В вашем наблюдательном блоке (в качестве наблюдателя) используется self, который будет использован непосредственно в сильным, как указано выше, что ваш наблюдатель будет там, так что self не может быть dealloc правильным способом.