iOS: outputStream не остается открытым

Итак, я реализую NSOutput и Input Streams. Когда они инициализируются, потоки открываются и подключаются к моему TCPServer, который у меня работает на моем ПК, но затем кажется, что они закрываются один раз вне функции инициализации или, возможно, потоки не сохраняются должным образом. Я не совсем уверен, поэтому любая помощь приветствуется

В моем файле .h:

@interface AVCamViewController : UIViewController <UIImagePickerControllerDelegate,UINavigationControllerDelegate, NSStreamDelegate> {
    NSOutputStream *outputStream;
    NSInputStream *inputStream;
}

@property (retain) NSInputStream *inputStream;
@property (retain) NSOutputStream *outputStream;

В моем файле .m:

@synthesize inputStream, outputStream;

    -(void)sendaResponse
    {
        NSString *response = [NSString stringWithFormat:@"Hello from Ipad Simulator"];
        NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
        [outputStream write:[data bytes] maxLength:[data length]];
        NSLog(@"%u", outputStream.streamStatus);
    }

    -(void)initNetworkCommunication
    {
        CFReadStreamRef readStream;
        CFWriteStreamRef writeStream;
        CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"10.9.100.122", 80, &readStream, &writeStream);

        NSInputStream *inputStream = (NSInputStream *) readStream;
        NSOutputStream *outputStream = (NSOutputStream *) writeStream;

        [inputStream setDelegate:self];
        [outputStream setDelegate:self];
        [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [inputStream open];
        [outputStream open];


        NSLog(@"%u and %u", inputStream.streamStatus, outputStream.streamStatus);
        NSString *response = [NSString stringWithFormat:@"Hello from Mikes Ipad Simulator"];
        NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
        [outputStream write:[data bytes] maxLength:[data length]];
        NSLog(@"%u", outputStream.streamStatus);
    }

    -(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
    {
        switch (eventCode) {
            case NSStreamEventOpenCompleted:
                NSLog(@"Stream Opened %u", outputStream.streamStatus);
                break;

            case NSStreamEventHasBytesAvailable:
                if(aStream == inputStream)
                {
                    uint8_t buffer [1024];
                    int len;

                    while ([inputStream hasBytesAvailable])
                    {
                        len = [inputStream read:buffer maxLength:sizeof(buffer)];
                        if(len>0)
                        {
                            NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];

                            if(nil != output)
                            {
                                NSLog(@"Server said: %@", output);
                            }
                        }
                    }
                }
                break;

            case NSStreamEventErrorOccurred:
                NSLog(@"Can not connect to the host!");
                break;

            case NSStreamEventEndEncountered:
                if(aStream == inputStream)
                    NSLog(@"Ending input stream");
                if(aStream == outputStream)
                    NSLog(@"Ending output stream");

                [aStream close];
                [aStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
                [aStream release];
                aStream = nil;
                break;

            default:
                break;
        }
    }

В initNetworkConnection симулятор подключается к моему TCPServer и открывает соединение (streamstatus = 2). Получает сообщение «Привет от Ipad Simulator». Но тогда у меня есть метод «sendaResponse», вызываемый нажатием кнопки, который затем streamstatus = 0 и «outputstream», похоже, не инициализирован. Я просто неправильно сохраняю переменную?


person justsomeguy    schedule 30.05.2013    source источник


Ответы (1)


Я предполагаю, что вы используете ARC. Удалите этот код:

{
NSOutputStream *outputStream;
NSInputStream *inputStream;
}

@synthesize inputStream, outputStream;

Это просто сбивает вас с толку между свойствами и переменными экземпляра. И результатом этого является то, что вы устанавливаете переменную экземпляра напрямую, а ваши экземпляры потока освобождаются ARC.

Вместо этого, как только вы удалили этот код выше, получите доступ к потокам с помощью self.inputStream и self.outputStream. Это позволит свойствам работать правильно и обеспечит соблюдение настроенной вами спецификации «сохранения».

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

    NSInputStream *inputStream = (NSInputStream *) readStream;
    NSOutputStream *outputStream = (NSOutputStream *) writeStream;

    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];

self.inputStream = inputStream;
self.outputStream = outputStream;

Затем измените свойство на:

@property (strong) NSInputStream *inputStream;
@property (strong) NSOutputStream *outputStream;
person Wain    schedule 30.05.2013
comment
Спасибо, очень ценю быстрый ответ! - person justsomeguy; 30.05.2013