2016-03-31 9 views
0

私はMaster Detail Applicationを使用しています。マスター画面がダッシュボードで、項目を選択する上で、私はバックエンド以下Alamofireリクエストでメモリ警告が発生する

Alamofire要求は私はシングルトンAPIマネージャクラスを持っているとの抜粋

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

あるトリガー詳細画面に移動しますディテールビューコントローラ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'に追加するリクエストを決して削除しないということです。

リクエストをキャンセルするとき、またはリクエストが正常に完了したときに、リクエストを確実に削除する必要があります。

次modifications-

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) 
     } 
    } 
} 
関連する問題