我正在做一个个人项目,昨晚遇到了 NSURLConnection 的异步性质。我正在构建一个与 restful api 接口的库。我期待在 Foundation 命令行工具和 Cocoa 应用程序中重用这个库。
有没有一种方法可以检查runloop是否可以调用同步方法,如果不是,则发送同步请求(如果在命令行工具中使用)。
或者,有没有办法始终使用异步方法,但强制应用程序在异步请求完成之前不退出?
我注意到了这一点,但我宁愿不必将调用放在库外运行。
谢谢你的帮助
我正在做一个个人项目,昨晚遇到了 NSURLConnection 的异步性质。我正在构建一个与 restful api 接口的库。我期待在 Foundation 命令行工具和 Cocoa 应用程序中重用这个库。
有没有一种方法可以检查runloop是否可以调用同步方法,如果不是,则发送同步请求(如果在命令行工具中使用)。
或者,有没有办法始终使用异步方法,但强制应用程序在异步请求完成之前不退出?
我注意到了这一点,但我宁愿不必将调用放在库外运行。
谢谢你的帮助
或者,有没有办法始终使用异步方法,但强制应用程序在异步请求完成之前不退出?
非常简单:
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());
}
另一个选项是-[NSRunLoop runUntilDate:]
在 while 循环中使用,并让委托设置一个“停止”标志:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
delegate:delegate
startImmediately:YES];
while( ![delegate connectionHasFinished] ){
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1];
}
我想您可以通过查看是否NSClassFromString(@"NSApplication")
返回非来检查程序是否与 AppKit 链接Nil
。然后,您可以使用+[NSThread isMainThread]
.
然而,图书馆试图“强制”应用程序不以任何原因退出是糟糕的设计。只需确定该库需要应用程序的合作,并提供一个清理和完成例程供其调用。可能还有一个正在进行的事情吗?功能。