Метод 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)