2015-02-06 4 views
0

Я получаю сбой моего приложения, которые дают мне отчет следующие аварии:Почему NSOperation запускает этот сбой?

http://crashes.to/s/bed19f6404b

Метод разжигании проблемы это одна:

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 

    let MapThread = NSOperationQueue() 
    MapThread.name = "Map Update" 
    MapThread.addOperationWithBlock() { 

     if self.StartandStop.titleLabel?.text == "Start Flight" || self.StartandStop.titleLabel?.text == "Démarrez" { 
      if let location = locations.first as? CLLocation { 
       let lastLocation = locations.last as? CLLocation 
       var altitude = lastLocation?.altitude 
       dispatch_async(dispatch_get_main_queue(),{ 
        self.mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 17, bearing: 0, viewingAngle: 0) 
       }); 
      } 
     } 

     if self.StartandStop.titleLabel?.text == "Stop Flight" || self.StartandStop.titleLabel?.text == "Arrêtez" { 
      if let mylocation = self.mapView.myLocation as CLLocation? { // This is the line indicated in the stack trace 
       let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) 
       if CMAltimeter.isRelativeAltitudeAvailable() { 
        println("Check") 
        appDelegate.maxAltitude = NSString(format: "%.01f", self.maxAlt*3.28084) + " Ft" 
       } 
       else { 
        let relativeAlt = (self.mapView.myLocation as CLLocation).altitude - appDelegate.elevation 
        appDelegate.altitudes.append(Float(relativeAlt)*3.28084) 
        self.altitude = Float(relativeAlt) 
        if appDelegate.maxAltitude == "" { 
         appDelegate.maxAltitude = "0.0 Ft" 
        } 
       } 
       var lastDistance = self.Distance(self.lastLocation, Coordinate2: (self.mapView.myLocation as CLLocation).coordinate) 
       self.distance += lastDistance 
       var lastSpeed = Float((self.mapView.myLocation as CLLocation).speed) 
       if self.groundspeed > lastSpeed { 
        appDelegate.groundspeed = NSString(format: "%.01f", Float((self.mapView.myLocation as CLLocation).speed)*1.94384) + " Kts" 
       } 
       self.groundspeed = lastSpeed 
       self.path.addCoordinate(self.mapView.myLocation.coordinate) 
       dispatch_async(dispatch_get_main_queue(),{ 
        GMSPolyline(path: self.path).map = self.mapView 
        self.mapView.camera = GMSCameraPosition(target: self.mapView.myLocation.coordinate as CLLocationCoordinate2D, zoom: 17, bearing: 0, viewingAngle: 0) 
       }); 
       self.lastLocation = (self.mapView.myLocation as CLLocation).coordinate 
      } 
     } 
    } 
} 

Катастрофа происходит после того, как приложение остается в фоновом режиме в течение длительного периода времени, когда этот метод работает часто. Может быть, NSOperation дает мне тяжелое время в фоновом режиме? У меня были проблемы с ним, так как я обновлял пользовательский интерфейс из фоновой темы. Затем я добавил рассылки GCD, чтобы нарисовать карту, и это зафиксировало последнюю проблему. Должен ли я пытаться как можно больше исключить NSOperation из моего приложения?

ответ

0

NSOperationQueue и NSBlockOperation - это просто удобные обертки вокруг GCD в любом случае, поэтому я не думаю, что вам удастся их удалить.

У меня есть три гипотезы:

  1. Ваши CLLocation объекты меняются в одном потоке, когда вы используете их на другой.
  2. Возможно, это связано с тем, что locations является принудительным распаковкой («неявно разворачивается»). Возможно, этот массив будет освобожден к тому моменту, когда вы обратитесь к ним, что приведет к сбою. (Это не должно быть, потому что вы держите ссылку на него.)
  3. Это может быть проблема с мостом Obj-C/Swift - если я читаю журналы правильно, на objc_retain, сохраняя объект после разворачивания его с опцией Swift.

В любом случае, я не уверен, что это ваша вина, но в качестве эксперимента вы можете сделать глубокую копию locations и использовать эту копию в своей операции.

+0

Боюсь, что я не знаком с этим термином. Что такое глубокая копия объекта? – user3185748

+0

Не беспокойтесь. См. Http://stackoverflow.com/a/184745/1445366 для пояснения. –

Смежные вопросы