iPhone线程问题

时间:2010-07-09 12:21:10

标签: iphone multithreading

我有一个应用程序,它有4个TableViewController,它们各自构成一个RSSParser实例,并有一个名为commonInit的函数,它启动解析。 最初,我从TableViewController中的默认初始化函数调用了commonInit,它工作正常但是如果没有互联网访问,我会得到4个警报窗口,这有点糟糕。 所以我想在appdelegate中进行可达性检查,然后通知每个TableViewController并启动解析器。可达性检查在单独的线程中启动,以避免在DNS问题等情况下停止。

但是当我运行应用程序时,解析器被称为正常,但它们从未收到任何数据。 在我的解析器中,我按照NSURLConnection的苹果示例进行了异步下载。

所以在我的appdelegate中我有:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 ....
 // Reachability setup, a new thread is created to make it async to avoid possible stall.
 [NSThread detachNewThreadSelector:@selector(checkConnection) toTarget:self withObject: nil];
 ...
 return YES;}

之后我有:

    -(void)checkConnection{
 //Test for Internet Connection
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

 Reachability *r = [Reachability reachabilityWithHostName:@"www.somehostname.com"];
 NetworkStatus internetStatus = [r currentReachabilityStatus];
 if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN)) {
  UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Missing Internet" message:@"Can not connect to the internet at the moment." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
  [errorAlert show];
 } else {
  [[NSNotificationCenter defaultCenter] postNotificationName:@"activation" object:nil];
 }
 [pool release];}

如您所见,如果有连接,我会发出以下通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"activation" object:nil];

希望你们能帮帮我。

1 个答案:

答案 0 :(得分:0)

我认为你应该在主线程上发布通知。

Grand Central Dispatch很容易。使用旧的API会有点困难。

我建议创建一种新方法:

- (void)postNotification:(NSDictionary *)userInfo {
  NSString *notificationName = [userInfo objectForKey:@"name"];
  [[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:nil];
}

然后用以下内容替换您要发布通知的行:

NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"activation" forKey:@"name"];
[self performSelectorOnMainThread:@selector(postNotification:) withObject:userInfo waitUntilDone:NO];