客观的长期投票

我有一个应用程序使用API​​在网站上获得实时更新。 他们使用他们所称的长轮询技术:

长轮询是传统轮询技术的变体,可以模拟从服务器到客户端的信息推送。 通过长轮询,客户端以类似于普通轮询的方式向服务器请求信息。 但是,如果服务器没有任何可用于客户端的信息,而不是发送空响应,服务器将保存该请求并等待某些信息可用。 一旦信息变得可用(或者在适当的超时之后),完整的响应被发送到客户端。 客户端通常会立即重新请求来自服务器的信息,以便服务器几乎总是会有一个可用的等待请求,用于响应事件提供数据。 在web / AJAX环境中,长轮询也被称为Comet编程。

长时间轮询本身不是推动技术,但可以在不可能实现真正推动的情况下使用。

基本上这会强制在您收到响应后再向服务器发送请求。 在iPhone应用程序中执行此操作的最佳方法是什么? 这最终必须在后台运行。


这正是NSURLConnection sendSynchronousRequest完美的用例:

- (void) longPoll {
    //create an autorelease pool for the thread
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    //compose the request
    NSError* error = nil;
    NSURLResponse* response = nil;
    NSURL* requestUrl = [NSURL URLWithString:@"http://www.mysite.com/pollUrl"];
    NSURLRequest* request = [NSURLRequest requestWithURL:requestUrl];

    //send the request (will block until a response comes back)
    NSData* responseData = [NSURLConnection sendSynchronousRequest:request
                            returningResponse:&response error:&error];

    //pass the response on to the handler (can also check for errors here, if you want)
    [self performSelectorOnMainThread:@selector(dataReceived:) 
          withObject:responseData waitUntilDone:YES];

    //clear the pool 
    [pool drain];

    //send the next poll request
    [self performSelectorInBackground:@selector(longPoll) withObject: nil];
}

- (void) startPoll {
    //not covered in this example:  stopping the poll or ensuring that only 1 poll is active at any given time
    [self performSelectorInBackground:@selector(longPoll) withObject: nil];
}

- (void) dataReceived: (NSData*) theData {
    //process the response here
}

或者,您可以使用异步I / O并委托回调来完成同样的事情,但在这种情况下这真的很愚蠢。


长时间轮询正在向服务器发送读取请求,服务器获取请求,发现发送给您没有任何兴趣,而不是不返回任何内容或“空白”,而是保持请求直到出现有趣的内容。 一旦它发现了什么,它会写入套接字并且客户端接收到数据。

详细情况是,在整个时间里,使用通用套接字编程,客户端被阻塞并挂在套接字上读取呼叫。

有两种方法可以解决这个问题(好吧,如果你不介意在主线程上停留几秒钟,但是我们不计算那个)。

  • 将套接字处理代码放入一个线程中。 在这种情况下,整个套接字进程在程序中是一个独立的线程,所以它很高兴地坐在读取等待响应的地方。

  • 使用异步套接字处理。 在这种情况下,您的套接字读取不会阻塞主线程。 相反,你传入回调函数来响应套接字上的活动,然后开始快乐的方式。 在Mac上,有CFSocket可以暴露这种功能。 它产生自己的线程,并使用select(2)管理套接字连接。

  • 这是一篇关于CFSocket的好帖子。

    CFSocket非常适合消息传递和事件的Mac成语,并且可能是您在做这类工作时应该考虑的内容。 在CFSocket上还构建了一个名为ULNetSocket(以前称为NetSocket)的Obj-C类封装器。

    链接地址: http://www.djcxy.com/p/74467.html

    上一篇: long polling in objective

    下一篇: Push vs polling with web service on iPhone