Вопрос новичка о запуске процесса в новой теме - PullRequest
0 голосов
/ 17 мая 2011

Пока мои приложения были довольно простыми, но теперь я обнаружил, что мне нужно запустить процесс в отдельном потоке, так что это вопрос xCode 101, спрашивающий, как мне это сделать.

Я хочузапустить процесс, который запускается при запуске приложения, поэтому я хочу выполнить его в AppDelegate.applicationDidFinishLaunching.

Из того, что я прочитал, я думаю, что это все, что мне нужно сделать, но, пожалуйста, исправьте меня, еслиЯ не прав.

// *** AppDelegate.m ****

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

    [NSThread detachNewThreadSelector:@selector([XMLParser parseXML:]) 
        toTarget:self
        withObject:requestStr];

}

// *** XMLParser.m ***

-(void)parseXML {

    // Dunno why NSAutoreleasePool is needed but apparently it is

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // . . . my code

    [pool release];

}


}

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Есть некоторая проблема, я думаю, @selector ожидает селектор, а не вызов метода. Таким образом, правильный должен быть такой

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

    [NSThread detachNewThreadSelector:@selector(parseXML:) 
        toTarget:objXMLParser
        withObject:requestStr];

}

//here the taget is the object whose selector you are passing. so you can't use self there as parseXML: is the method of XMLParser class

// *** XMLParser.m ***

-(void)parseXML {

    // Dunno why NSAutoreleasePool is needed but apparently it is

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // . . . my code

    [pool release];

}

// Автозапуск пула необходим, так как он является отдельным потоком, и ваш код может использовать некоторое количество какао или ваши собственные вызовы / методы / код, которые автоматически освобождают объект, поэтому вы должны сохранить пул автоматического освобождения для этих автоматически выпущенных объектов. если ваш код не использует оператор [obj autorelease] или не выполняет автоматическое освобождение объекта, в этом случае вы можете опустить операторы автоматического освобождения пула, но рекомендуется сохранить его.

0 голосов
/ 17 мая 2011

Я не использовал описанный вами метод, но использовал NSOpertaions . Он поддерживает одновременные и не параллельные операции и прост в использовании.

...