3

我有一个类通过 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 ...
4

2 回答 2

8

我在 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;
    }
}
于 2009-08-01T10:54:48.550 回答
4

就目前您提供的代码而言,getNewDatabase:它正在您的应用程序的主线程上运行。正如詹姆斯在他的案例中所观察到的,这种特殊情况下的问题不是线程的生命周期。

如果您确实打算在后台执行此操作,我建议您考虑使用NSOperationQueueNSOperation不是使用当前代码解决问题。我认为您的案例非常适合NSOperationQueue,特别是考虑到您有多个下载任务要执行。

Dave Dribin 有一篇关于在NSOperation. 或者,只要您在后台线程中运行,您也可以简化流程并在您的 NSOperation 中使用同步 API 方法,例如initWithContentsOfURL:.

Marcus Zarra 还编写了一个教程,演示了合并和使用 NSOperationQueue 进行简单的后台操作是多么容易。

于 2009-08-01T15:05:45.107 回答