这是我的代码:
MainDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
FetchManager *fetchManager = [FetchManager sharedInstance];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0), ^{
[fetchManager fetchData];
});
//regular code continues
}
FetchData.m(这是一个单例类)
- (id)getInstance { ... }
- (void)fetchData
{
NSURL *url = [NSURL URLWithString:@"http://www.data.xml"];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];
if (connectionInProgress) {
[connectionInProgress cancel];
[connectionInProgress release];
}
[xmlData release];
xmlData = [[NSMutableData alloc] init];
connectionInProgress = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
}
/*and all necessary NSXMLParserDelegate protocol methods are implemented - not shown here*/
问题:没有触发任何NSXMLParserDelegate协议方法。我不知道为什么。如果我删除了didFinishLaunchingWithOptions方法中的“dispatch_async”,那么事情就会按预期工作 - 触发NSXMLParserDelegate协议方法。
有人看到问题吗?
答案 0 :(得分:2)
有两件事情跳出来:
NSURLConnection需要运行循环才能运行。当您在主线程上运行时,会自动运行一个连接将自行安排的运行循环。当您使用dispatch_async()时,您的块将在某些可能没有运行循环的辅助线程中调度,或者其运行循环可能不在允许NSURLConnection运行的模式下。
即使连接可以自行安排,块也会在创建连接后立即结束。 NSURLConnection期望在创建它的线程上发送其委托消息,但是如果块已经结束,它将如何工作?是否有某种有效的上下文可以在该线程上调用委托?
答案 1 :(得分:0)
正如Caleb所述,NSURLConnection需要一个运行循环。实现目标的一种方法是创建NSOperation的子类,使循环保持活动并管理委托回调。另一种方法是使用这个惊人的新Api,只需要创建一个NSOperationQueue,但只能在iOS5上使用sendAsynchronousRequest:queue:completionHandler