iPhone - Threading и делегирование - PullRequest
0 голосов
/ 21 февраля 2011

Я запускаю некоторый код в фоновом потоке, чтобы получить текстовый файл из службы. Этот код запускает делегата в какой-то момент. Он выдает ошибку SIGABRT при вызове делегата, и моя концепция тоже не звучит мне убедительно.

Код, работающий в фоновом потоке:

- (void)FetchStores
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // Fetch from service
    NSString *serviceURL = @"http://../index.html";
    NSURL *myURL = [NSURL URLWithString:serviceURL];
    NSData *dataRep = [NSData dataWithContentsOfURL:myURL];

    storesList = [[Stores alloc] init];
    storesList.storesDelegate = self;
    [storesList FetchWithNSData:dataRep];

    [pool release];
}

Объект storesList запускает делегат после извлечения всех хранилищ из службы. Делегат попадает в функцию в главном потоке.

У вас есть предложения, что я делаю не так?

Спасибо,

е.

Ответы [ 2 ]

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

При вызове делегата где-то вы должны переключиться на основной поток.Особенно, если где-то вы обновляете пользовательский интерфейс на основе полученных данных.

Вы можете использовать - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait для переключения.

Может быть так:

storesList = [[Stores alloc] init];
storesList.storesDelegate = self;
[storesList performSelectorOnMainThread:@selector(FetchWithNSData:) withObject:dataRep waitUntilDone:TRUE];

В вашем случае вы должны использовать waitUntilDone:TRUE, чтобы у метода FetchWithNSData была возможность сохранить данные.

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

Кажется вполне вероятным, что FetchWithNSData: не сохраняет переданные dataRep и данные освобождаются на следующей строке, где вы истощаете локальный пул автоматического выпуска?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...