Nano Hash - криптовалюты, майнинг, программирование

Почему 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 из своего приложения?

06.02.2015

Ответы:


1

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

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

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

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

06.02.2015
  • Боюсь, я не знаком с этим термином. Что такое глубокая копия объекта? 06.02.2015
  • Не волнуйтесь. См. stackoverflow.com/a/184745/1445366 для основного объяснения. 06.02.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..