Установка данных в фоновом потоке и получение ошибки bad_access

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

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

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

Спасибо!

Редактировать 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

}

person daspianist    schedule 22.03.2016    source источник
comment
Спасибо @muku - я опубликовал код, который показывает, когда я впервые вызываю performSelectorInBackground, и, в конечном итоге, какой метод вызывает исключение bad_access.   -  person daspianist    schedule 22.03.2016
comment
Убедитесь, что ваш код работает в одном потоке   -  person Tony Thomas    schedule 22.03.2016
comment
что такое populateDictionaries и можете ли вы попробовать NSMutableDictionary` с nonatomic   -  person Mukesh    schedule 22.03.2016
comment
Привет @TonyThomas - код отлично работает в одном потоке, за исключением того, что UIProgressView не обновляется соответствующим образом.   -  person daspianist    schedule 22.03.2016
comment
@muku populateDictionaries вызывает alloc и init класса Dictionary   -  person daspianist    schedule 22.03.2016


Ответы (1)


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

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

Спасибо.

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