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