【问题标题】:The slider's values are transferred in the socket, but the slider visual position doesn't change滑块的值在套接字中传输,但滑块的视觉位置不会改变
【发布时间】:2011-09-17 09:20:56
【问题描述】:

我在 iPod 客户端和 C 服务器之间建立了连接。 我可以在移动滑块时发送滑块的数据,并正确获取服务器上的数据。唯一的问题是滑块的蓝点不会移动,它下面的标签也不会改变滑块的值。当我断开连接时,蓝点会移动到应有的位置,并且标签会显示其值。以下是代码:

-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
  switch (streamEvent)
  {         
    case NSStreamEventHasSpaceAvailable:
        event = @"NSStreamEventHasSpaceAvailable";
        connectButton.enabled = NO;
        disconnectButton.enabled = YES;

        if (theStream == oStream)
        {
         //send data
             const uint8_t *buffer = (const uint8_t *)[dataSlider UTF8String];  
             NSInteger err = [self writeToServer:buffer];                 
             if ( err == -1)
                NSLog(@"Error sending data."); 
             else   
                NSLog(@"Success sending data.");
        }
        break;
}

- (IBAction)sliderChanged:(id)sender 
{ 
   UISlider *slider = (UISlider *)sender; 
   progressAsInt = (int)(slider.value + 0.5f); 
   sliderValue = [[NSString alloc] initWithFormat:@"%d", progressAsInt]; 
   sliderLabel.text = sliderValue; 
   dataSlider = sliderValue;
}

这是它应该工作的方式:服务器总是要求打印一些东西。每当服务器调用 read() 时,我都会移动滑块并发送它的值。

问题:滑块在视觉上没有移动,但它的值发生了变化(我可以在服务器的 printfs 中看到它)。

有什么想法吗?

【问题讨论】:

  • 没有任何代码几乎不可能有任何想法。你试过 setNeedsDisplay 吗?
  • 嗯...基本上我对滑块的了解是:- (IBAction)sliderChanged:(id)sender { UISlider *slider = (UISlider *)sender; progressAsInt = (int)(slider.value + 0.5f); sliderValue = [[NSString alloc] initWithFormat:@"%d", progressAsInt]; sliderLabel.text = sliderValue; dataSlider = sliderValue; } 我在调用 [self writeToServer:buffer]; 时使用 dataSlider 不,我不知道,我会寻找它。

标签: ios sockets networking slider uislider


【解决方案1】:

可能有两个问题:

  1. 您需要致电setNeedsDisplay

  2. 您正在使用与服务器的同步/阻塞连接。如果您使用同步/阻塞通信,那么包括 UI 更新在内的所有内容都将等到通信结束。如果是这种情况,则使用异步连接。当您断开连接时 UI 会更新,这是最可能的问题。

【讨论】:

  • 嗯..如果我错了,请纠正我。我建立连接,然后服务器进入 read() 状态(阻塞)。当 iOS 触发事件 NSStreamEventHasSpaceAvailable 时,它会发送 Slider 的当前值。这不是异步的吗? (注意,服务器只是重复读取和 printf。也许这可以理解为 iOS App 内部的同步,不是吗?)
  • 看起来这就是问题所在。请在问题中添加相关代码,以便其他成员可以检查。我没有直接在 iPhone 中使用低级套接字,所以不完全确定发生了什么。
  • 如果我在不同的线程中做了滑块的东西怎么办?我从来没有使用过线程..:s
  • UI 更新应该在主线程中完成。您可以启动一个新线程与服务器通信。
  • @taskinoor 是的..这就是我接下来要尝试的。谢谢提示
【解决方案2】:

嗯.. 我得到了它的工作,但有点滞后:s 使用的代码是:(在 stream:handleEvent: 方法中)

case NSStreamEventHasSpaceAvailable:
        event = @"NSStreamEventHasSpaceAvailable";
        connectButton.enabled = NO;
        disconnectButton.enabled = YES;

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        if (theStream == oStream)
        {
            //send data
            const uint8_t *buffer = (const uint8_t *)[dadosSlider UTF8String];  
            NSInteger err = [self writeToServer:buffer];
            // [msg release];

            if ( err == -1)
                NSLog(@"Erro a enviar os dados."); 
            else   
                NSLog(@"Transmitiu com sucesso.");


        }
});
        break;

关于如何让它完美运行的想法?谢谢

(要明确一点。这里的目的是让 iPod 仅在服务器请求 read() 时发送数据)

【讨论】:

  • 今天我前进了一点.. 在服务器端,我在每次读取和 printf 之后(在循环结束时)写了一个getchar(),我发现在我之后例如,将滑块从 11(初始值)移动到 20,在我按任意键几次后,我从 printf 得到的结果仍然是 11 而不是 20。我注意到的另一件事是 NSLog 不断收到@987654325 的信号@and 然后连续发送数据,即使在来自服务器的read()call 并处于暂停状态之后。想法?我应该更深入地研究异步吗?
  • 只是为了清楚。此处的目的是让 iPod 仅在服务器请求 read() 时发送数据
【解决方案3】:

似乎常量“知道流有可用空间”阻塞了程序和 UI。我更改了程序的流程以等待来自服务器的消息,然后才发送数据。这里是:

case NSStreamEventHasBytesAvailable:
        event = @"NSStreamEventHasBytesAvailable";
        if (theStream == iStream)
         {           
            //read data
            uint8_t buffer[1024];
            int len;
            while ([iStream hasBytesAvailable])
            {
                len = [iStream read:buffer maxLength:sizeof(buffer)];
                if (len > 0)
                {
                    NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
                    if (nil != output)
                    {                 
                        //Now that the server gave its signal to move on, send data to server

                        NSString *data = [[torqueValue stringByAppendingString:@" "] stringByAppendingString:angleValue];
                        const uint8_t *buffer2 = (const uint8_t *)[data UTF8String];  
                        NSInteger err = [self writeToServer:buffer2];

                        if ( err == -1)
                            NSLog(@"Erro a enviar os dados."); 
                        else   
                            NSLog(@"Transmitiu com sucesso.");

                    }
                }
            }    
         }
        break;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多