寻找MacOS Threaded Networking示例代码

时间:2008-10-01 14:19:11

标签: cocoa multithreading macos networking sample

我的代码需要在单独的NSThread中运行所有网络例程。 我有一个库,我通过一个回调例程进行通信:

my thread code
    library
        my callback (networking)
    library
my thread code

我的回调例程必须将一些数据发送到HTTP服务器(NSURLConnection),等待答案(启动NSRunLoop?),然后返回库。
然后,库处理数据。 在库返回我的线程后,我可以向主线程发布通知,处理绘图和用户输入。

是否有任何示例代码涵盖如何在NSThread中使用NSURLConnection?

5 个答案:

答案 0 :(得分:1)

如果你需要阻止,直到完成工作并且你已经在一个单独的线程上,你可以使用+[NSURLConnection sendSynchronousRequest:returningResponse:error:]。但它有点生硬,所以如果你需要更多的控制,你将不得不切换到一个异步NSURLRequest,其中包含在当前NSRunLoop中安排的委托方法(即回调)。在这种情况下,一种方法可能是在完成时让你的委托标志,并允许运行循环处理事件,直到设置标志或超过超时。

答案 1 :(得分:1)

Kelvin的链接已经死了,这里有一些代码可以满足您的需求(意味着在[NSThread detachNewThreadSelector:toTarget:WithObject:]调用的方法中运行)。请注意,当您进入运行循环时,连接基本上以soo开始工作,并且“terminateRunLoop”意味着BOOL在启动时设置为NO,并在连接完成加载或设置错误时设置为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];
}

答案 2 :(得分:0)

回答您的小问题“启动NSRunLoop?”:

我不确定我理解,但听起来你说上面的伪代码都是在辅助线程上执行的(即不是主事件处理线程)。如果是这种情况,创建NSRunLoop可能没有任何意义,因为在等待HTTP服务器响应时您无法执行任何有用的工作。让线程阻止。

答案 3 :(得分:0)

NSURLConnection可以通过其异步委托方法在后台线程(例如NSThread或NSOperation)中同步使用。但是,它确实需要了解NSRunLoop的工作原理。

有一个博客文章带示例代码和解释,在这里: http://stackq.com/blog/?p=56

示例代码下载了一个图像,但我使用了这个概念来对REST API进行复杂的POST调用。

-Kelvin

答案 4 :(得分:0)

你使用线程有什么特别的原因吗?除非你打开很多连接,否则主线程上的NSRunLoop应该足够好了。如果您需要在响应中执行阻塞工作,那么请创建您的线程。