EXC_BAD_ACCESS при добавлении данных в массив с одновременным использованием 2 NSOperations

У меня есть:

1) Запуск 2 асинхронных NSUrlRequests одновременно

2) Как только один из двух запросов загрузил данные XML, NSOperationQueue используется для запуска синтаксического анализатора XML. Таким образом, ParseOperations работают точно так же, как в примере LazyTableImages от Apple.

InfoRequestHelper.m

// ...

case GetBlogEntries:
{
    BlogParseOperation *parser = [[BlogParseOperation alloc] initWithXMLString:result delegate:self];
    parser.tag = helper.requestTag;

    [queue addOperation:parser]; // this will start the "ParseOperation"

    [parser release];

    break;
}
case GetTweets:
{
    TwitterParseOperation *parser = [[TwitterParseOperation alloc] initWithXMLString:result delegate:self];
    parser.tag = helper.requestTag;

    [queue addOperation:parser]; // this will start the "ParseOperation"

    [parser release];

    break;
}

// ...

3) Когда синтаксический анализ завершен, срабатывает parser:didFinishParsing:.

InfoRequestHelper.m

- (void)parser:(ParseOperationBase *)parser didFinishParsing:(NSArray *)entries
{
    // Save data, remove completed request from list
    [self.requestsInProgress removeObjectForKey:parser.tag];
    [self.resultObjects addObjectsFromArray:entries];  // <= !!! EXC_BAD_ACCESS !!! here

    // ..    
}

Проблема: когда сюда приходит первое событие, объекты могут быть добавлены в массив. Но когда приходит второй, возникает EXC_BAD_ACCESS.


person Walter A. Jablonowski    schedule 09.02.2011    source источник
comment
Обновление: этот пост выглядит интересным: depl0y.com/?p=345, попробуем это...   -  person Walter A. Jablonowski    schedule 28.08.2011


Ответы (2)


Изменить: я думаю, вы пытаетесь получить доступ к переменной resultObjects в обоих методах синтаксического анализа. а resultObjects — это mutableArray. поэтому проблема в том, что когда вы пытаетесь добавить или удалить объект из своей переменной из одной функции, другая функция также пытается получить к ней доступ. Это даст вам ошибку. Я тоже узнал об этом при создании многопоточного приложения.

Вы можете увидеть документацию Apple по небезопасным классам потоков. и лучший способ избежать этого — использовать вместо этого объект NSArray.

И когда вы хотите добавить или удалить объект из своей переменной, вы можете сначала поместить содержимое в изменяемый массив и выполнить над ним манипуляции, а затем назначить его обратно исходному объекту.

Я надеюсь это имеет смысл. Я знаю, как трудно было бы найти такие ошибки.

person Robin    schedule 09.02.2011
comment
Спасибо за ваш ответ. Не решает проблему... приложение постоянно выдает EXC_BAD_ACCESS. - person Walter A. Jablonowski; 09.02.2011
comment
попробуйте очистить сборку и удалите папку сборки из каталога вашего проекта - person Robin; 09.02.2011

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

Сначала вы должны заблокировать массив, а затем продолжить.

person Madhup Singh Yadav    schedule 09.02.2011
comment
@Walter\ Jablonowski Не могли бы вы опубликовать код, отредактировав этот же вопрос? - person Madhup Singh Yadav; 14.02.2011