NSURLConnection的代表团和线程 - iPhone(NSURLConnection d

2019-06-27 11:23发布

我有一个类,通过NSURLConnection的更新应用程序的文件目录中的两个的.plist文件。 类作为自己的委托NSURLConnection的。 它正常工作时,我问了一个文件,但是当我尝试更新两个文件失败。 它看起来像我应该开始为每个getNewDatabase消息的新线程?

- (void)getAllNewDatabases {
    [self performSelectorOnMainThread:@selector(getNewDatabase:) withObject:@"file1" waitUntilDone:YES];
    [self performSelectorOnMainThread:@selector(getNewDatabase:) withObject:@"file2" waitUntilDone:YES];
}

- (BOOL)getNewDatabase:(NSString *)dbName
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSMutableString *apiString = [[NSMutableString alloc] initWithString:kAPIHost];
    [apiString appendFormat:@"/%@.plist",dbName];
    NSURLRequest *myRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:apiString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    NSURLConnection *myConnection = [[NSURLConnection alloc] initWithRequest:myRequest delegate:self];
    [apiString release];
    if( myConnection )
    {
        //omitted for clarity here
    }
    [pool release];
}
//NSURLConnection delegate methods here ...

Answer 1:

我发现了一些与NSURLConnection的和有趣的NSThread - 线程只会活,只要它需要执行您从中调用该方法。

在纱线之上的情况下,只要仅将生活getNewDatabase:(NSString *)dbName需要完成,因此扼杀了它的任何委托方法,他们实际上有时间做任何事情之前。

我发现这个网站,提供更好的解释和解决问题的办法

我调整了一点点,所以我可以有一个自定义的时间,如果它(当有人走动的接入点之间的方便)没有在给定的时间内完成

    start = [NSDate dateWithTimeIntervalSinceNow:3];

    while(!isFinished && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode 
                                                  beforeDate:[NSDate distantFuture]]){

    if([start compare:[NSDate date]] == NSOrderedAscending){
        isFinished = YES;
    }
}


Answer 2:

正如您所提供的代码目前维持, getNewDatabase:您的应用程序的主线程上运行。 那么在这种特殊情况下的问题比线程的生命周期中其他的东西,如詹姆斯在他的情况下观察到的。

如果你是打算在后台执行此操作,我建议考虑使用NSOperationQueueNSOperation而不是解决当前代码的问题。 我觉得你的情况是一个非常适合NSOperationQueue ,特别是考虑到你有一个以上的下载任务来执行。

戴夫Dribin具有优异的物品有关使用异步API,如NSURLConnection的,内侧NSOperation 。 另外,只要你在后台线程上运行,也可以简化程序,只需在您的NSOperation使用同步API方法来代替,如initWithContentsOfURL:

马库斯Zarra还写了一个教程演示了它是多么容易合并及使用NSOperationQueue简单的后台操作。



文章来源: NSURLConnection delegation and threading - iPhone