2009-11-29 4 views
0

을 iPhone 응용 프로그램에서 읽는 중, wifi를 통한 소켓 연결이 있으며 inputStream에서 읽고 outputStream에 쓸 필요가 있습니다. 문제는 스트림 관리가 이벤트 중심적이며 읽기 전에 NSStreamEventHasBytesAvailable 이벤트를 기다려야한다는 것입니다. 그래서 handleEvent : eventCode 대리자 메서드 외부에서 읽는 것을 알 수는 없습니다. NSStream에서 대리자 메서드 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

스트림 클래스는 아마도 "stream : handleEvent :"를 호출하기 위해 EventQueue에 이벤트를 배치했습니다. 코드가 이벤트 처리기에 제어를 반환하지 않으면 이벤트 대기열을 읽을 수 없습니다. 당신이 아마 대신 그 방법을하고 싶은 것입니다 :

참조 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; 
     } 
     } 
} 
관련 문제