NSURLConnection委托和线程 - iPhone

Flu*_*imp 3 iphone cocoa multithreading cocoa-touch nsurlconnection

我有一个类通过NSURLConnection更新app文档目录中的两个.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 ...
Run Code Online (Sandbox Code Playgroud)

Jam*_*uld 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;
    }
}
Run Code Online (Sandbox Code Playgroud)