Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iphone ios线程问题:使用dispatch\u async时委托对象没有响应_Iphone_Multithreading_Ios_Delegates - Fatal编程技术网

iphone ios线程问题:使用dispatch\u async时委托对象没有响应

iphone ios线程问题:使用dispatch\u async时委托对象没有响应,iphone,multithreading,ios,delegates,Iphone,Multithreading,Ios,Delegates,这是我的密码: main.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { FetchManager *fetchManager = [FetchManager sharedInstance]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORI

这是我的密码:

main.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(这是一个单例类)

问题:未激发任何NSXMLParserDelegate协议方法。我不知道为什么。如果我删除didFinishLaunchingWithOptions方法中的“dispatch_async”,那么一切都会按预期进行—NSXMLParserDelegate协议方法将被触发

有人看到问题了吗?

有两件事会跳出来:

  • NSURLConnection需要运行循环才能运行。当您在主线程上运行时,会自动出现一个运行循环,连接将在该循环上调度自身。当您使用dispatch_async()时,您的块被安排在某些次线程中,这些次线程可能没有运行循环,或者其运行循环可能不在允许NSURLConnection运行的模式下

  • 即使连接可以自行调度,块也会在创建连接后立即结束。NSURLConnection希望在创建它的线程上发送它的委托消息,但是如果块已经结束,该如何工作呢?是否存在某种可以在该线程上调用委托的有效上下文


  • 正如Caleb所述,NSURLConnection需要一个运行循环。实现所需功能的一种方法是创建NSOperation的子类,该子类使循环保持活动状态并管理委托回调。另一种方法是使用这个惊人的新Api,它只需要创建一个NSOperationQueue,但仅在iOS5上可用
    sendAsynchronousRequest:queue:completionHandler

    ,谢谢您提供的信息!我真正想做的是有一个后台线程,每5分钟从中获取数据。实际上,我想把[fetchManager fetchData];被一个能睡5分钟的while(真)循环包围。每个人都在循环。显然,这不起作用。我不知道在后台从url轮询数据的更好方法是什么。
    -(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项{FetchManager*FetchManager=[FetchManager sharedInstance];而(true){dispatch_async(dispatch_get_global_queue)(dispatch_queue_PRIORITY_HIGH,0),^{[fetchManager fetchData];}}};
    但这显然不起作用。我的情况几乎是一样的,我仍然没有找到答案(
    - (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*/