3

NSURLConnection を介してアプリ ドキュメント ディレクトリ内の 2 つの .plist ファイルを更新するクラスがあります。このクラスは、NSURLConnection の独自のデリゲートとして機能します。単一のファイルを要求すると正常に動作しますが、2 つのファイルを更新しようとすると失敗します。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ため、実際に何かを実行する前にデリゲート メソッドを強制終了します。

問題のより良い説明と解決策を提供するこのWebサイト見つけました

少し調整して、指定された時間内に完了しなかった場合にカスタム タイムアウトを設定できるようにしました (誰かがアクセス ポイント間を歩き回っているときに便利です)。

    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:は、アプリケーションのメイン スレッドで実行されています。この特定のケースの問題は、ジェームズが彼のケースで観察したように、スレッドのライフサイクル以外の何かです。

この操作をバックグラウンドで実行するつもりだった場合は、現在のコードで問題を解決するのではなく、使用することを検討することをお勧めしNSOperationQueueますNSOperationNSOperationQueue特に、実行するダウンロード タスクが複数あることを考えると、あなたのケースは にぴったりだと思います。

Dave Dribin は、NSURLConnection などの非同期 API の使用に関する優れた記事NSOperationを. または、バックグラウンド スレッドで実行している限り、プロセスを簡素化し、代わりに NSOperation などの同期 API メソッドを使用することもできますinitWithContentsOfURL:

Marcus Zarra は、単純なバックグラウンド操作に NSOperationQueue を組み込んで使用するのがいかに簡単かを示すチュートリアルも書いています。

于 2009-08-01T15:05:45.107 に答える