2012-04-11 4 views
4

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

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

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

私は気づいたthisしかし、私はむしろライブラリの外で実行する呼び出しをする必要はないと思います。任意のヘルプ

答えて

4

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

- (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()); 
} 

他のオプションを:デリゲートは、接続が行われていると判断したとき、それは、後でそれを停止することが可能ですので、私はCFRunLoopRun()ここで使用

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

:簡単パイとして

whileループで-[NSRunLoop runUntilDate:]を使用し、デリゲートが「停止」フラグを設定するようにします:

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

while(![delegate connectionHasFinished]){ 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]; 
} 
0

ため

おかげで私は、プログラムがNSClassFromString(@"NSApplication")戻りNilを非場合は見てのAppKitに対してリンクされているかどうかをチェックすることができたとします。次に、+[NSThread isMainThread]を使用してメインスレッドにいるかどうかを確認できます。

しかし、ライブラリが何らかの理由でアプリケーションを強制的に終了させようとするのは難しい設計です。図書館がアプリの協力を必要としていることを確認し、それを呼び出すためのクリーンアップ・アンド・フィニッシュルーチンを提供するだけです。おそらく存在していることもあるでしょうか?関数。