Чтение\запись NSStream вне метода делегата handleEvent:eventCode

в приложении для 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;
      }
       }
}

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

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


person kevin    schedule 29.11.2009    source источник


Ответы (1)


Класс потока, вероятно, поместил событие в 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:

И общий обзор программирования Cocoa: 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;
      }
       }
}
person Eld    schedule 29.11.2009