iOS:CFRunLoopRun()函数混乱

时间:2012-11-25 04:12:00

标签: objective-c ios multithreading cfrunloop

我已经阅读过有关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()函数调用生成一个新线程吗?

谢谢!

2 个答案:

答案 0 :(得分:8)

实际上有一种情况是有意义的。在创建递归运行循环时(执行该行时会发生这种情况):

  

可以递归地运行运行循环。换句话说,你可以   调用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;
}

因此,方法serverRequest将不会退出,直到您实际停止RunLoop:

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

    CFRunLoopStop(CFRunLoopGetCurrent());
}

我不会这样做,最好将这项工作传递给工作线程。还有其他方法可以实现相同而不使用Run Loop。

答案 1 :(得分:3)

假设这是从主线程调用的,没有任何理由调用CFRunLoopRun,因为默认的运行循环应该已经在运行。

您使用NSURLConnection的方式不会阻止调用线程。 可能在内部生成其他线程,但您并不需要关心它。 initWithRequest:delegate:将立即返回,您的委托方法将在稍后调用(收到响应,加载数据等)。