Cocoa 寻找MacOS线程网络示例代码
我的代码需要在单独的NSThread中运行所有网络例程。 我有一个库,我通过一个回调例程进行通信:Cocoa 寻找MacOS线程网络示例代码,cocoa,multithreading,macos,networking,sample,Cocoa,Multithreading,Macos,Networking,Sample,我的代码需要在单独的NSThread中运行所有网络例程。 我有一个库,我通过一个回调例程进行通信: my thread code library my callback (networking) library my thread code 我的回调例程必须将一些数据发布到HTTP服务器(NSURLConnection),等待回答(启动nsrunlop?),然后返回库。 然后,库处理数据。 在库返回到我的线程后,我可以向处理绘图和用户输入的主线程发布通知 是否有
my thread code
library
my callback (networking)
library
my thread code
我的回调例程必须将一些数据发布到HTTP服务器(NSURLConnection),等待回答(启动nsrunlop?),然后返回库。然后,库处理数据。 在库返回到我的线程后,我可以向处理绘图和用户输入的主线程发布通知
是否有任何示例代码介绍如何在NSThread中使用NSURLConnection?回答您的小问题“启动nsrunlop?”:
我不确定我是否理解,但听起来你好像在说上面的伪代码都是在辅助线程上执行的(即,不是主事件处理线程)。如果是这种情况,创建nsrunlop可能没有任何意义,因为在等待HTTP服务器响应时,您无法执行任何有用的工作。只需让线程阻塞。如果您需要阻塞,直到您完成了工作并且已经在一个单独的线程上,您可以使用
+[NSURLConnection sendSynchronousRequest:returningResponse:error:
。不过这有点直截了当,因此如果需要更多控制,则必须切换到异步NSURLRequest
,并在当前nsrunlop
中安排委托方法(即回调)。在这种情况下,一种方法可能是让您的委托在完成时进行标记,并允许运行循环处理事件,直到设置标记或超过超时。NSURLConnection可以通过其异步委托方法在后台线程(例如NSThread或NSOperation)中同步使用。但是,它确实需要了解nsrunlop的工作原理
这里有一篇带有示例代码和说明的博客文章:
示例代码下载了一个图像,但我使用了这个概念对RESTAPI进行了复杂的POST调用
-开尔文使用线程有什么特殊原因吗?除非打开大量连接,否则主线程上的nsrunlop应该足够好。如果您需要执行阻塞工作作为响应,那么就创建线程。Kelvin的链接已失效,下面是一些代码,可以满足您的要求(用于在[NSThread detachNewThreadSelector:toTarget:WithObject:]调用的方法中运行)。请注意,当您进入运行循环时,连接基本上会立即开始工作,“TerminateRunLop”意味着在启动时将BOOL设置为NO,在连接完成加载或出现错误时将BOOL设置为YES 为什么要这样做而不是阻塞同步请求?一个原因是,您可能希望能够正确地取消长时间运行的连接,即使您没有很多连接。此外,我还看到,如果在主运行循环中开始执行大量异步请求,UI会有点挂起
NSURLConnection *connection = [[NSURLConnection connectionWithRequest:request delegate:self] retain];
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
while(!terminateRunLoop)
{
if ( ![[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantFuture]])
{ break; }
[pool drain];
}
[pool release];
}