Чтение / запись NSStream вне метода делегата handleEvent: eventCode - PullRequest
0 голосов
/ 29 ноября 2009

в приложении для iPhone у меня есть сокетное соединение через Wi-Fi, и мне нужно читать из inputStream и записывать в outputStream. Проблема в том, что управление потоками управляется событиями, и мне приходится ждать события NSStreamEventHasBytesAvailable, прежде чем читать. Поэтому я не могу знать при чтении \ записи вне метода делегата handleEvent: eventCode.

Я пробовал цикл while, но понял, что во время цикла приложение не получает сообщения делегатов и никогда не останавливается:

Псевдо-код:

-(void) myFunction {
   canRead=NO;
   [self writeToStream:someData];
   while(!canRead) { };
   readData=[self readFromStream];
}

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {

    switch(eventCode) {
          case NSStreamEventHasBytesAvailable: {
        canRead=YES;
        break;
      }
       }
}

Я думаю, что я мог бы читать \ писать внутри метода делегата, но мне нужно читать \ писать много раз вне этого.

Помощь! Спасибо

1 Ответ

0 голосов
/ 29 ноября 2009

Потоковый класс, вероятно, поместил событие в EventQueue для вызова «stream: handleEvent:». Невозможно прочитать очередь событий, если ваш код не вернет управление обработчику событий. Что вы, вероятно, хотите сделать вместо этого:

См. http://developer.apple.com/iphone/library/documentation/cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/performSelectorOnMainThread:withObject:waitUntilDone:

И общий обзор программирования Какао: http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CoreAppArchitecture/CoreAppArchitecture.html#//apple_ref/doc/uid/TP40002974-CH8-SW45

-(void)myFunction1 {
  [self writeToStream:somedata];
}
-(void)myFunction2 {
  readData=[self readFromStream];
}
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
    switch(eventCode) {
          case NSStreamEventHasBytesAvailable: {
            [self myFunction2];
        break;
      }
       }
}
...