adi*_*dit 12 iphone objective-c ipad
我有一个应用程序,它使用API在网站上获得实时更新.他们使用他们所谓的长轮询技术:
长轮询是传统轮询技术的变体,允许模拟从服务器到客户端的信息推送.通过长轮询,客户端以与普通轮询类似的方式从服务器请求信息.但是,如果服务器没有可用于客户端的任何信息,而不是发送空响应,则服务器保留请求并等待一些信息可用.一旦信息可用(或在适当的超时之后),就会向客户端发送完整的响应.然后,客户端通常会立即从服务器重新请求信息,这样服务器几乎总会有一个可用的等待请求,它可以用来传递数据以响应事件.在web/AJAX上下文中,长轮询也称为Comet编程.
长轮询本身不是推送技术,但可以在无法实现真正推动的情况下使用.
基本上,这会在您收到回复后强制将请求发回服务器.在iPhone应用程序中执行此操作的最佳方法是什么?这最终必须在后台运行.
aro*_*oth 16
这正是一种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
}
Run Code Online (Sandbox Code Playgroud)
或者,你可以使用异步I/O和委托回调来完成同样的事情,但在这种情况下,这确实有点愚蠢.
长轮询正在向服务器发出读取请求,服务器获取请求,发现没有任何兴趣发送给您,而不是不返回任何内容,或"空",而是保留请求直到有趣的东西出现.一旦找到了什么,它就会写入套接字并且客户端会收到数据.
细节是,在整个时间内,使用通用套接字编程,客户端被阻塞并挂在套接字读取调用上.
有两种方法可以解决这个问题(好吧,如果你不介意在主线程上停留几秒钟就会有三个,但是不要指望那个).
将套接字处理代码放在一个线程中.在这种情况下,整个套接字进程位于程序中的一个独立线程中,因此它很高兴地停留在等待响应的读取上.
使用异步套接字处理.在这种情况下,您的套接字读取不会阻止主线程.相反,你传入回调函数,响应套接字上的活动,然后以你的快乐方式.在Mac上,有CFSocket公开了这种功能.它产生自己的线程,并使用select(2)管理套接字连接.
这是一个很好的小帖子,谈论CFSocket.
CFSocket非常适合消息传递和事件的Mac习惯,并且很可能是你应该在做这类工作时看到的.还有一个基于CFSocket的Obj-C类包装器,名为ULNetSocket(以前称为NetSocket).
| 归档时间: |
|
| 查看次数: |
14705 次 |
| 最近记录: |