Приложение зависло из-за CLLocationManager (mainThread заблокирован?) - PullRequest
1 голос
/ 06 ноября 2011

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

Идея состоит в том, что он загружает первые несколько вещей, затем запрашивает разрешение при необходимости и продолжает после этого. Сначала это сработало, и я не уверен, что я изменил, чтобы сломать его, но я надеюсь, что некоторые из вас увидят, что не так. Я уже несколько часов смотрю на это вслепую, так что хотелось бы по-новому взглянуть на это:)

Для людей, читающих это во второй раз: Да, я переписал вопрос, так как проблема, кажется, где-то еще, чем я думал.

Мое приложение никогда не преодолеет этот кусок кода:

dispatch_sync(dispatch_get_main_queue(), ^{
    locationManager = [[CLLocationManager alloc]init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    [locationManager startUpdatingLocation];
});

Это первое, что происходит в моем методе didFinishLaunching, и я не могу найти ничего, что блокировало бы основную тему. Ранее у меня была похожая проблема, когда мне удалось получить авторизацию от менеджера местоположений, но позже приложение остановилось при отправке в основную очередь (для инициализации моего интерфейса). Так почему же он заблокирован?

1 Ответ

1 голос
/ 06 ноября 2011

Что ж, ваша основная очередь в данный момент выполняется application:didFinishLaunchingWithOptions:. Затем вы приходите и просите его подождать (dispatch_sync), пока он не выполнит блок диспетчера местоположения - что он не может начать делать, пока основная очередь больше не занята. Итак, у вас классическая тупиковая ситуация.

Почему вы все равно используете блок dispatch_sync?

...