2013-05-30 3 views
0

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

В моем файле .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» не представляется инициализированным. Я просто не сохраняю переменную должным образом?

ответ

3

Я предполагаю, что вы используете 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; 
+0

Спасибо, очень признателен быстрый ответ! – justsomeguy

Смежные вопросы