0

我正在尝试定期将数据流式传输到服务器,并以快速且不会阻塞 UI 的方式执行此操作。UI 也非常忙于显示数据。目前我的实现使用每 50 毫秒触发一次的 NSTimer,从圆形数组中挑选一个网络数据包并将其发送过来:

//this is the timer

     networkWriteTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(sendActivity:)  userInfo:nil repeats:YES];


    -(void)sendActivityInBackground:(id)sender
    {
         [[AppConfig getInstance].activeRemoteRoom.connection sendNetworkPacket:[circularArray objectAtIndex:arrayIndex%arrayCapacity]];
    }


    -(void)sendActivity:(NSTimer*)timer
    {

        // Send it out
        [self performSelectorInBackground:@selector(sendActivityInBackground:) withObject:nil];

    }

我对这种方法的性能不满意。时间分析表明,执行背景选择器会产生开销,并且性能会变得非常不稳定。

我正在考虑提高性能的其他方法:

  • 提高当前基于计时器的代码的性能
  • 尝试大中央调度
  • 使用单个操作实现 NSOperationsQueue。
  • 使用唤醒、检查更新并在需要时将其发送过来的专用线程

理想情况下,我会以更快的间隔发送数据(10 毫秒甚至每个活动更新)。这就提出了一个问题:实现一系列后台发送请求的最快方法是什么,其中顺序很重要?我想确保在发送下一个数据包之前发送一个数据包。

4

1 回答 1

0

尝试一个循环调度计时器(这是 gcd 的一部分):

self.synchronizerQueue = dispatch_queue_create("synchronizer queue", DISPATCH_QUEUE_SERIAL);
self.synchronizeTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.synchronizerQueue);
dispatch_source_set_timer(self.synchronizeTimer, DISPATCH_TIME_NOW, NSEC_PER_MSEC * 10, NSEC_PER_MSEC * 1);
dispatch_source_set_event_handler(self.synchronizeTimer, ^
{
   // do your processing here
});
dispatch_resume(self.synchronizeTimer);
于 2013-05-08T13:36:40.297 回答