2016-03-22 5 views
0

Моя цель состоит в том, чтобы инициализировать большой объем данных в другом (не главном) потоке, а затем обновить UIProgressView в основном потоке, соответствующем прогрессу большой загрузки данных. Для этого я использую performSelectorInBackground для загрузки данных и обновления прогресса на протяжении всего использования, используя performSelectorOnMainThread.Настройка данных в фоновом потоке и получение ошибки bad_access

В настоящее время я получаю ошибку EXE_BAD_ACCESS из одного из словарей, которые я инициализирую, в частности, строки, где я устанавливаю self.someDictionary = @{...}. self.someDictionary принимает значения strong и nonatomic и инициализируется на основной теме.

Как новичок в многопоточности, я начинаю видеть, что я не должен устанавливать сильное свойство и nonatomic (однако его изменение до atomic все равно вызвало сбой). Что еще я делаю неправильно, чтобы вызвать ошибку EXE_BAD_ACCESS, и как мне установить большой объем данных в NSDictionary в не основной поток и все еще иметь возможность обновлять ход основного потока?

Спасибо!

Edit 1:

Код:

//In viewWillAppear, from the main thread 
[self performSelectorInBackground:@selector(populateDictionaries) withObject:nil]; 

//In populateDictionaries method 
Dictionary *someDictionary = [[Dictionary alloc] init]; 

//the methods inside the Dictionary class 
- (id) init{ 
    self = [super init]; 
    if (self){ 
     [self makeDictionaries]; 
    } 

    return self; 
} 
- (void)makeDictionaries{ 

    self.insiderDictionary = @{ ...} //this line is causing the crash 

} 
+0

Пожалуйста, напишите ur код – Mukesh

+0

Спасибо @muku - Я отправил код, который показывает, когда я сначала вызываю 'performSelectorInBackground', и в конечном итоге, какой метод вызывает исключение bad_access. – daspianist

+0

Убедитесь, что код ur работает в одном потоке –

ответ

0

Если вы хотите, чтобы выполнить процесс в фоновом режиме Ьги очереди диспетчерского

ссылка: https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

Спасибо.

+0

Привет, Vivek, спасибо за сообщение. Если у вас есть какие-либо конкретные предложения по коду или связанные с ними вопросы, которые вы могли бы связать, это было бы очень полезно. Хотя я знаю GCD и концепцию использования очередей, связывание всего документа не обязательно помогает мне понять, что вызывает ошибку, или что можно сделать для ее решения. – daspianist

+1

Решение для переопределенных объектов - это зомби. Когда эта функция включена, фиктивный объект (зомби) хранится на месте каждого выпущенного объекта, что позволяет отлаживать уже выпущенные объекты. Очень легко включить: - Дважды щелкните свой исполняемый файл в «Исполняемые файлы» в XCode Откройте вкладку «Аргументы» В «Переменные, которые должны быть установлены в среде» (это список внизу, будьте осторожны, какой из них вы редактируете) нажмите кнопку «+», а для имени переменной введите «NSZombieEnabled» и для значения «YES» –