最近接到一个需求,需要iOS设备实时获取服务器的数据,并动态显示在图表中。
主要工作有以下几点:1、写一个轮询,每隔一段时间就从服务器获取数据;2、根据获取到的数据显示在图表中。
1、轮询操作:
轮询的方法很多,比如通过NSthread起个线程,并在子线程中循环请求服务数据,通过GCD的定时器也可以实现,本文采用的是通过RunLoop的形式,RunLoop的优势大家可以百度下。不过这些都不是最优方法,最好的是通过websocket。
话不多说,直接上代码吧。
runLoop模块:
新建图表显示的控制器类:DeviceChartViewController
-(void)myRunloop
{
[NSThread detachNewThreadSelector:@selector(newThreadFun) toTarget:self withObject:nil];
}
-(void)newThreadFun
{
@autoreleasepool {
end =NO;
NSRunLoop * myRunLoop =[NSRunLoop currentRunLoop];
CFRunLoopObserverContext context = {0,CFBridgingRetain(self),NULL,NULL,NULL};
CFRunLoopObserverRef observer = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, &myRunLoopObserver, &context);
if (observer) {
CFRunLoopRef cfRunloop = [myRunLoop getCFRunLoop];
CFRunLoopAddObserver(cfRunloop, observer, kCFRunLoopDefaultMode);
}
[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(timerprocess) userInfo:nil repeats:YES];
while (!end) {
[myRunLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3.0]];
}
}
}
-(void)timerprocess{
ESPCNetworkDeviceDetailRequest *request = [[MyRequest alloc] init];
[self request:request];
}
void myRunLoopObserver(CFRunLoopObserverRef observer,CFRunLoopActivity activity,void* info)
{
switch (activity) {
case kCFRunLoopEntry:
NSLog(@"run loop entry");
break;
case kCFRunLoopBeforeTimers:
NSLog(@"run loop before times");
break;
case kCFRunLoopBeforeSources:
NSLog(@"run loop before sources");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"run loop before waiting");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"run loop after waiting");
break;
case kCFRunLoopExit:
NSLog(@"run loop exit");