我有一个应用程序,它有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];
希望你们能帮帮我。
答案 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];