2016-03-31 48 views
0

我正在使用主控細節應用程序。主屏幕是一塊儀表盤和選擇項目,移動到詳細屏幕,我在後臺Alamofire請求會給出內存警告

低於觸發Alamofire請求片斷

class APIManager: NSObject { 

    class var sharedManager: APIManager { 
     return _sharedManager 
    } 

    private var requests = [Request]() 

    // Cancel any ongoing download 
    func cancelRequests() { 
     if requests.count > 0 { 
      for request in requests { 
       request.cancel() 
      } 
     } 
    } 

    func getData(completion: (dataSet: [Data]?, error: NSError?) -> Void) { 
     let request = Alamofire.request(.GET, "http://request") 
      .response { (request, response, data, error) in 
       dispatch_async(dispatch_get_main_queue(), { 
        if(error == nil) { 
         if let response = data, data = (try? NSJSONSerialization.JSONObjectWithData(response, options: [])) as? [NSDictionary] { 

          var dataSet = [Data]() 
          for (_, dictionary) in data.enumerate() { 
           let lat = dictionary["Latitude"] 
           let lng = dictionary["Longitude"] 
           let id = dictionary["ID"] as! Int 
           let data = Data(lat: lat!, long: lng!, id: shuttleID) 
           dataSet.append(data) 
          } 
          completion(dataSet: dataSet, error: nil) 
         } 
        } else { completion(dataSet: nil, error: error) } 
       }) 
     } 
     requests.append(request) 
    } 
} 

我有一個單獨的API管理器類,並從詳細視圖控制器我稱之爲getData()函數。一切正常。

但是,當我重複推動和彈出時,我看到內存迅速增加,並且在10-15次嘗試後,我收到內存警告。但在AppDelegate我管理它顯示一條警報消息並添加一個延遲計時器8秒。但是,20-25嘗試應用程序崩潰後,由於內存警告。

viewWillDisappear(),我也取消了任何正在進行的請求。但我無法停止記憶警告問題。我評論了我稱之爲請求的部分,我沒有發現問題,即使內存消耗也較少。

我歡迎創意。

回答

0

上分析,我發現內存警告是不是由於Alamofire請求。這是由於MKMapView。加載MKMapView,放大和縮小消耗更多內存。所以,在viewWillDisappear我做了修復。

override func viewWillDisappear(animated:Bool){ 
    super.viewWillDisappear(animated) 
    self.applyMapViewMemoryFix() 
} 

func applyMapViewMemoryFix(){ 
    switch (self.mapView.mapType) { 
     case MKMapType.Hybrid: 
      self.mapView.mapType = MKMapType.Standard 
      break; 
     case MKMapType.Standard: 
      self.mapView.mapType = MKMapType.Hybrid 
      break; 
     default: 
      break; 
    } 
    self.mapView.showsUserLocation = false 
    self.mapView.delegate = nil 
    self.mapView.removeFromSuperview() 
    self.mapView = nil 
} 

禮貌 - Stop iOS 7 MKMapView from leaking memory

0

問題是你永遠不會刪除你追加到成員變量'requests'的請求。

當您取消請求或請求成功完成時,您需要確保刪除請求。

請執行以下變通

func cancelRequests() { 
     if requests.count > 0 { 
      for request in requests { 
       request.cancel() 
      } 
     } 
     requests.removeAll() //Delete all canseled requests 
    } 

also 

func getData(completion: (dataSet: [Data]?, error: NSError?) -> Void) { 
     let request = Alamofire.request(.GET, "http://request") 
      .response { (request, response, data, error) in 
       dispatch_async(dispatch_get_main_queue(), { 
        if(error == nil) { 
         if let response = data, data = (try? NSJSONSerialization.JSONObjectWithData(response, options: [])) as? [NSDictionary] { 

          var dataSet = [Data]() 
          for (_, dictionary) in data.enumerate() { 
           let lat = dictionary["Latitude"] 
           let lng = dictionary["Longitude"] 
           let id = dictionary["ID"] as! Int 
           let data = Data(lat: lat!, long: lng!, id: shuttleID) 
           dataSet.append(data) 
          } 
          requests.removeObject(request) 
          completion(dataSet: dataSet, error: nil) 
         } 
        } else { 
         requests.removeObject(request) 
         completion(dataSet: nil, error: error) } 
       }) 
     } 
     requests.append(request) 
    } 

加入這個方便擴展的陣列刪除項目代碼:

// Swift 2 Array Extension 
extension Array where Element: Equatable { 
    mutating func removeObject(object: Element) { 
     if let index = self.indexOf(object) { 
      self.removeAtIndex(index) 
     } 
    } 

    mutating func removeObjectsInArray(array: [Element]) { 
     for object in array { 
      self.removeObject(object) 
     } 
    } 
}