检查NSRunLoop并使用适当的NSURLConnection方法

时间:2012-04-11 13:10:29

标签: objective-c cocoa foundation

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

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

或者,是否有一种方法可以始终使用异步方法,但强制应用程序在异步请求完成之前不会退出?

我注意到this但我宁愿不必将调用放在库外运行。

感谢您的帮助

2 个答案:

答案 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]检查您是否在主线程上。

然而,图书馆试图“迫使”应用程序因任何原因不退出的设计很糟糕。只需确定该库需要应用程序的合作,并提供一个清理和完成例程,以便它调用。可能还有什么东西正在进行中?功能