2009-08-01 121 views
3

我有一個類,通過NSURLConnection更新應用程序文檔目錄中的兩個.plist文件。該類充當它自己的NSURLConnection委託。當我要求單個文件時它工作正常,但當我嘗試更新兩個文件時失敗。它看起來像我應該爲每個getNewDatabase消息啓動一個新的線程?NSURLConnection委託和線程 - iPhone

- (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 ... 

回答

8

我發現了一些與NSURLConnection的和有趣的NSThread - 線程只會活,只要它需要執行您從中調用該方法。

在上面的例子中,線程的生存時間只有getNewDatabase:(NSString *)dbName需要完成的時間,因此在他們真正有時間去做任何事情之前,終止它的任何委託方法。

我發現this網站,提供更好的解釋和問題

我調整了一點點,所以我可以有一個自定義的時間,如果它在給定的時間內未完成的解決方案(方便當有人走動的接入點之間)

start = [NSDate dateWithTimeIntervalSinceNow:3]; 

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

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

您鏈接到的博客文章已被移動 - 我相信這是它:http://www.sortedbits.com/nsurlconnection-in-its-own-thread – 2012-06-11 13:45:56

4

正如您所提供的代碼目前維持,getNewDatabase:是應用程序的主線程上運行。正如詹姆斯在他的案例中所看到的那樣,這個特殊情況下的問題不是線程的生命週期。

如果您確實打算在後臺執行此操作,我建議您考慮使用NSOperationQueueNSOperation,而不是使用當前代碼解決問題。我認爲你的情況非常適合NSOperationQueue,尤其是考慮到你有多個下載任務需要執行。

Dave Dribin有一個excellent article關於在NSOperation內部使用異步API(例如NSURLConnection)。另外,只要你在後臺線程中運行,你也可以簡化這個過程,只需在NSOperation中使用同步API方法,比如initWithContentsOfURL:

Marcus Zarra還有written a tutorial,它演示瞭如何簡單地將NSOperationQueue合併並用於簡單的後臺操作。

+0

謝謝 - 與此同時 - 我分叉了一個版本與NSOperation/NSOperationQueue完全一樣。現在完美運作。 – FluffulousChimp 2009-08-01 15:21:26