EXC_BAD_ACCESS при добавлении данных в массив, используя 2 операции NSO одновременно - PullRequest
2 голосов
/ 09 февраля 2011

У меня есть:

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

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

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.

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

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

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

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

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

0 голосов
/ 09 февраля 2011

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

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

...