4

私は個人的なプロジェクトに取り組んでおり、昨夜NSURLConnectionの非同期性に遭遇しました。安らかなAPIとインターフェースするライブラリを構築しています。FoundationコマンドラインツールとCocoaアプリケーションの両方で、このライブラリを再利用することを期待しています。

runloopが同期メソッドを呼び出すために使用できるかどうかを確認し、使用できない場合は同期要求を送信する方法はありますか(コマンドラインツールで使用されている場合)。

あるいは、常に非同期メソッドを使用するが、非同期要求が終了するまでアプリケーションを強制的に終了しない方法はありますか?

私はこれに気づきましたが、ライブラリの外で実行するために呼び出しを行う必要はありません。

助けてくれてありがとう

4

2 に答える 2

4

あるいは、常に非同期メソッドを使用するが、非同期要求が終了するまでアプリケーションを強制的に終了しない方法はありますか?

やさしい:

int main(int argc, char *argv[])
{   
    // Create request, delegate object, etc.
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
                                                                  delegate:delegate 
                                                          startImmediately:YES];
    CFRunLoopRun();
    // ...
}

CFRunLoopRun()後でデリゲートが接続が完了したと判断したときに停止できるため、ここで使用します。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // This returns control to wherever you called
    // CFRunLoopRun() from.
    CFRunLoopStop(CFRunLoopGetCurrent());
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Error: %@", error);
    CFRunLoopStop(CFRunLoopGetCurrent());
}

もう1つのオプションは-[NSRunLoop runUntilDate:]、whileループで使用し、デリゲートに「停止」フラグを設定させることです。

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
                                                              delegate:delegate 
                                                      startImmediately:YES];

while( ![delegate connectionHasFinished] ){
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1];
}
于 2012-04-11T17:41:18.167 に答える
0

プログラムがAppKitに対してリンクされているかどうかNSClassFromString(@"NSApplication")は、が返されないかどうかを確認することで確認できると思いますNil。次に、を使用してメインスレッドを使用しているかどうかを確認できます+[NSThread isMainThread]

ただし、ライブラリが何らかの理由でアプリを終了しないように「強制」しようとするのは、設計が不十分です。ライブラリがアプリの協力を必要としていることを確認し、ライブラリが呼び出すためのクリーンアップと終了のルーチンを提供するだけです。おそらくまた、進行中の何かがありますか?働き。

于 2012-04-11T15:50:49.530 に答える