Остановите NSThread во время загрузки - PullRequest
0 голосов
/ 23 декабря 2009

У меня есть приложение для iPhone, в котором я отображаю табличное представление, загруженное из RSS-канала. Когда представление загружено, я вызываю этот метод для запуска в новом NSThread:

- (void)start:(NSURL*)url {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSXMLParser *XMLParser = [[[NSXMLParser alloc] initWithContentsOfURL:url] autorelease];
    [XMLParser setDelegate:self];

    if (items) {
        [items release];
    }
    items = [[NSMutableArray alloc] init];

    [self startParsing:XMLParser];

    [pool drain];
}

Работает нормально, но если пользователь покидает представление во время загрузки или анализа XML-файла, я хочу, чтобы поток прекратил работу, но как мне остановить его работу без утечки памяти? Кроме того, если он запускает -initWithContentsOfURL: метод, в то время как я хочу остановить его, как бы я остановил этот метод?

Ответы [ 3 ]

3 голосов
/ 23 декабря 2009

Если вы ожидаете, что вам понадобится контролировать соединения (т. Е. Прервать соединение, если пользователь отменяет или уходит), вам, вероятно, следует использовать асинхронный API NSURLConnection для загрузки ваших данных перед анализом XML. Помимо предоставления вам возможности закрывать соединения по мере необходимости, вы также сможете лучше реагировать на сетевые ошибки.

Как указано в NSD, вам, вероятно, следует реализовать какой-то метод cancel в классе, который управляет вашим потоком синтаксического анализа XML, - тогда просто используйте performSelector:onThread:withObject:waitUntilDone: (или аналогичный) из основного потока, когда пользователь отменяет загрузку или уходит прочь.

1 голос
/ 23 декабря 2009

Это ваши варианты остановки потока

http://developer.apple.com/mac/library/documentation/cocoa/reference/Foundation/Classes/NSThread_Class/Reference/Reference.html#//apple_ref/doc/uid/20000311-DontLinkElementID_12

И из других мест в руководстве

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

0 голосов
/ 23 декабря 2009

Возможно, вам стоит взглянуть на классы NSOperation и NSOperationQueue.

Эти классы дают вам огромный контроль над параллелизмом и асинхронным выполнением.

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

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

Ознакомьтесь с документацией для NSOperation и NSOperationQueue .

...