4

我正在做一个个人项目,昨晚遇到了 NSURLConnection 的异步性质。我正在构建一个与 restful api 接口的库。我期待在 Foundation 命令行工具和 Cocoa 应用程序中重用这个库。

有没有一种方法可以检查runloop是否可以调用同步方法,如果不是,则发送同步请求(如果在命令行工具中使用)。

或者,有没有办法始终使用异步方法,但强制应用程序在异步请求完成之前不退出?

我注意到了这一点,但我宁愿不必将调用放在库外运行。

谢谢你的帮助

4

2 回答 2

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());
}

另一个选项是-[NSRunLoop runUntilDate:]在 while 循环中使用,并让委托设置一个“停止”标志:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
                                                              delegate:delegate 
                                                      startImmediately:YES];

while( ![delegate connectionHasFinished] ){
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1];
}
于 2012-04-11T17:41:18.167 回答
0

我想您可以通过查看是否NSClassFromString(@"NSApplication")返回非来检查程序是否与 AppKit 链接Nil。然后,您可以使用+[NSThread isMainThread].

然而,图书馆试图“强制”应用程序不以任何原因退出是糟糕的设计。只需确定该库需要应用程序的合作,并提供一个清理和完成例程供其调用。可能还有一个正在进行的事情吗?功能。

于 2012-04-11T15:50:49.530 回答