客观的长期投票
我有一个应用程序使用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