2

CFRunLoop について読んだことがありますが、まだ少し混乱しています。私は自分自身で明確にしたいコードにクロスしました:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:url]]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];
[[NSURLConnection alloc]initWithRequest:request delegate:self];

CFRunLoopRun();

では、これがすべてメイン スレッドで呼び出されていると仮定すると、メイン スレッドがブロックされますか? それとも、CFRunLoopRun() 関数呼び出しによって新しいスレッドを生成しますか?

ありがとう!

4

2 に答える 2

9

実際にそれが理にかなっているケースがあります。再帰的な実行ループを作成している間 (その行を実行すると、次のようになります):

実行ループを再帰的に実行することができます。つまり、CFRunLoopRun、CFRunLoopRunInMode、または任意の NSRunLoop メソッドを呼び出して、入力ソースまたはタイマーのハンドラー ルーチン内から実行ループを開始できます。その際、外側の実行ループで使用されているモードを含め、ネストされた実行ループを実行する任意のモードを使用できます。

したがって、ポイントは次のようにすることです。

- (NSMutableData *)serverRequest
{
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:url]]];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:postData];
    [[NSURLConnection alloc]initWithRequest:request delegate:self];

    CFRunLoopRun();
    return _returnDataFromServer;
}

したがって、serverRequestRunLoop を実際に停止するまで、メソッドは終了しません。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // Append the new data to the instance variable you declared
    [_connectionData appendData:data];

    CFRunLoopStop(CFRunLoopGetCurrent());
}

私はこれをしません。この作業を作業スレッドに渡すことをお勧めします。実行ループを使用せずに同じことを達成する方法は他にもあります。

于 2013-12-13T17:32:24.090 に答える
3

CFRunLoopRunこれがメイン スレッドから呼び出されると仮定すると、既定の実行ループが既に実行されているはずなので、実際には を呼び出す理由はありません。

使用している方法はNSURLConnection、呼び出し元のスレッドをブロックしません。内部で追加のスレッドを生成する場合がありますが、実際に気にする必要はありません。initWithRequest:delegate:ほとんどすぐに返され、デリゲート メソッドは後で呼び出されます (応答が受信されたとき、データが読み込まれたときなど)。

于 2012-11-25T04:18:38.390 に答える