【问题标题】:CocoaAsyncSocket / GCDAsyncSocket add a delay between writes on the queueCocoaAsyncSocket / GCDAsyncSocket 在队列上的写入之间添加延迟
【发布时间】:2013-02-11 14:19:23
【问题描述】:

我有以下功能:

if (socket==nil)
  socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
if (elBuffer==nil) 
  elBuffer = [[NSMutableData alloc] init];
}

if ([socket isDisconnected]) {
  NSError *err = nil;
  [socket connectToHost:elControlador.ip onPort:9761 error:&err]
}

[socket writeData:@"A01" withTimeout:30 tag:1];
[socket writeData:@"A02" withTimeout:30 tag:1];
[socket writeData:@"A03" withTimeout:30 tag:1];
[socket writeData:@"A04" withTimeout:30 tag:1];
[socket writeData:@"A05" withTimeout:30 tag:1];
[socket readDataWithTimeout:30 buffer:elBuffer bufferOffset:0 maxLength:-1 tag:1];

它工作得很好,除了套接字服务器在两次写入之间需要一秒钟左右的时间才能工作。我想知道是否有人遇到过同样的问题,并且可以阐明如何实现这一目标。谢谢。

【问题讨论】:

    标签: queue delay cocoaasyncsocket gcdasyncsocket


    【解决方案1】:

    如果您希望客户端在写入这些字符串之间等待:

    • 将它们放入一个数组中。
    • 使用重复的NSTimer
    • 在定时器回调中,一次写一行,直到数组用完,然后使定时器失效。

    【讨论】:

    • 我想避免必须有一个数组并跟踪索引,但它确实让我知道如何修复它。谢谢。
    • 如果对您有帮助,请考虑投票。
    【解决方案2】:

    我能够使用以下方法使其正常工作:

    int i=0;
    for(id aItem in aIDs) {
      NSString *directCommand = [NSString stringWithFormat:@"A%@",aItem];
      [self performSelector:@selector(fSend:) withObject:directCommand afterDelay:(2.0*i)];
      i++;
    }
    [socket readDataWithTimeout:30 buffer:elBuffer bufferOffset:0 maxLength:-1 tag:1];
    
    -(void)fSend : (NSString *)aCommand {
      [socket writeData:aCommand withTimeout:30 tag:1];
    }
    

    这让我在执行 writeData 之间有 2 秒的时间,而不必冻结应用程序,也不会用写入淹没我的设备。

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 2022-12-13
      • 2017-02-23
      • 2022-08-13
      • 2023-01-17
      • 1970-01-01
      • 2016-03-03
      • 2021-10-26
      • 1970-01-01
      相关资源
      最近更新 更多