2

私はObjective-Cの初心者です。での作業方法を学ぼうとしていNSStreamます。Appleサポートの簡単なコードを使用しました。このコードは、デスクトップのファイルからストリームを開き、デリゲートがiStreamによって呼び出されたときに簡単なメッセージを表示する必要があります。コードの最後で、ステータスが正しいことがわかりますが、デリゲートが呼び出されることはありません。私は何が欠けていますか?

#import <Foundation/Foundation.h>

@interface MyDelegate: NSStream <NSStreamDelegate>{
}

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

@end

@implementation MyDelegate

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode  {
    NSLog(@"############# in DELEGATE###############");
}

@end

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        MyDelegate* myDelegate=[[MyDelegate alloc]init];
        NSInputStream* iStream= [[NSInputStream alloc] initWithFileAtPath:@"/Users/Augend/Desktop/Test.rtf"];

        [iStream setDelegate:myDelegate];

        [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                           forMode:NSDefaultRunLoopMode];
        [iStream open];

        NSLog(@" status:%@",(NSString*) [iStream streamError]);
    }
    return 0;
}
4

1 に答える 1

7

実行ループは、デリゲートメソッドが呼び出されるのに十分な時間実行されていません。

追加:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];

ストリームを開いた直後。これは、GUIのない​​プログラムでのみ必要です。そうしないと、実行ループがスピンしてしまいます。

終了する前に呼び出されたことを絶対に確認したい場合はstream:handleEvent:、そのメソッドに(グローバル)フラグを設定し、フラグをテストrunUntilDate:するwhileループに入れます。

while( !delegateHasBeenNotified ){
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
}
于 2012-09-02T19:03:24.667 に答える