我已经阅读过有关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()函数调用生成一个新线程吗?
谢谢!
答案 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:
将立即返回,您的委托方法将在稍后调用(收到响应,加载数据等)。