Метод hasSpaceAvailable NSOutputStream всегда возвращает False

В моем приложении мне нужно использовать опрос вместо цикла выполнения при выполнении определенных операций по сети.

Мой код выглядит ниже

-(id) init
{
    self = [super init];
    if (self) {
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    NSURL *host = [NSURL URLWithString:@"http://localhost/"];
    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)([host host]), 5525, &readStream, &writeStream);
    _writeStream = [[NSOutputStream alloc] initToMemory];
    _readStream = (__bridge NSInputStream *)(readStream);
    _writeStream = (__bridge NSOutputStream *)(writeStream);
    [_readStream open];
    [_writeStream open];
  }
   return self;
}

-(void) writeIntoNetworkWith:(NSString *)info
{
if ([self.writeStream hasSpaceAvailable]) {
    NSData * data = [[NSData alloc] initWithData:[info dataUsingEncoding:NSUTF8StringEncoding]];
    [self.writeStream write:[data bytes] maxLength:[data length]];
}
else
    NSLog(@"Write Stream Not Available");
}
-(NSString *) readFromNetwork
{
   NSMutableString * send;
   if ([self.readStream hasBytesAvailable])
  {
    uint8_t buffer[1024];
    int len;
    len = [self.readStream read:buffer maxLength:1024];
    if (len >0)
    {
        send = [[NSMutableString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
    }
}
return send;
}

и viewControler.m выглядит следующим образом

- (void)viewDidLoad {
  [super viewDidLoad];
  SuperTestClass * n = [[SuperTestClass alloc]init];
  NetworkReadAndWrite * obj = [[NetworkReadAndWrite alloc]init];
  [obj writeIntoNetworkWith:@"Hello World"];
  [obj readFromNetwork];
}

Сервер при получении некоторых данных отвечает сообщением "Hello"

При запуске приведенного выше кода всегда возвращается, что нет noSpaceAvailable/ noBytesAvailable для записи или чтения из выходного и входного потока соответственно.

Мне интересно, если я что-то здесь упускаю.

1 ответ

Решение

Догадаться. Была глупая ошибка. Должен был дождаться, пока в потоке чтения не появятся байты для чтения.

while(1)
{

    if ([self.readStream hasBytesAvailable])
    {
        uint8_t buffer[1024];
        int len;
        len = [self.readStream read:buffer maxLength:1024];
        if (len >0)
Другие вопросы по тегам