Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 寻找MacOS线程网络示例代码_Cocoa_Multithreading_Macos_Networking_Sample - Fatal编程技术网

Cocoa 寻找MacOS线程网络示例代码

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?),然后返回库。 然后,库处理数据。 在库返回到我的线程后,我可以向处理绘图和用户输入的主线程发布通知 是否有

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

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];
}