如何使用委托在NSStream?(How to use delegate in NSStream?)

2019-06-27 17:06发布

我在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;
}

Answer 1:

运行循环没有运行足够长的时间要调用的委托方法。

加:

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

之后打开流。 这只是一个必要的程序没有GUI - 否则运行的循环将被剥离为您服务。

如果你想绝对确保stream:handleEvent:被称为退出之前,设置在该方法的(global)标志,并把runUntilDate:while循环,对于标志测试:

while( !delegateHasBeenNotified ){
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
}


文章来源: How to use delegate in NSStream?