到目前为止,我的应用程序非常简单,但现在我发现我需要在一个单独的线程上运行一个进程,所以这是一个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];
}
}
答案 0 :(得分:1)
我认为有一些问题,@ 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];
}
//需要自动释放池,因为它是一个单独的线程,你的代码可能会使用一些cocoa或你自己的调用/方法/代码来自动释放一个对象,这就是你必须为这些自动释放的对象保留一个自动释放池的原因。如果您的代码不使用任何[obj autorelease]
语句或者在这种情况下不自动释放对象,则可以省略自动释放池语句,但保留它是一种很好的做法。
答案 1 :(得分:0)
我没有使用您描述的方法,但已使用NSOpertaions。它支持但并发和非并发操作,并且易于使用。