Значения ползунка передаются в сокет, но визуальное положение ползунка не изменяется - PullRequest
0 голосов
/ 17 июня 2011

У меня есть соединение между клиентом 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;
}

Вот как это должно работать: сервер всегда запрашивает что-то для печатиf.Я перемещаю ползунок и отправляю его значение всякий раз, когда сервер вызывает read ().

Проблема: ползунок визуально не перемещается, но его значение изменяется (я вижу это в printfs сервера).

Есть мысли?

Ответы [ 3 ]

0 голосов
/ 20 июня 2011

Хм .. у меня все получилось, но немного отстает: 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;

Идеи о том, как заставить его работать без нареканий? Thks

(Просто чтобы прояснить ситуацию. Цель заключается в том, чтобы iPod отправлял данные только в тот момент, когда сервер запрашивает read())

0 голосов
/ 23 июня 2011

Кажется, что константа "зная, что поток имеет доступное пространство " засоряла программу и пользовательский интерфейс. Я изменил поток программы, чтобы ждать сообщения от сервера, и только после этого он будет отправлять данные. Вот оно:

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;
0 голосов
/ 17 июня 2011

Возможны две проблемы:

  1. Вам нужно позвонить setNeedsDisplay.

  2. Вы используете синхронное / блокирующее соединение с сервером. Если вы используете синхронную / блокирующую связь, то все, включая обновление пользовательского интерфейса, будет ждать, пока связь не будет завершена. Если это так, используйте асинхронное соединение. Поскольку пользовательский интерфейс обновляется при отключении, это наиболее вероятная проблема.

...