首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NSStream中使用委托?

如何在NSStream中使用委托?
EN

Stack Overflow用户
提问于 2012-09-03 02:54:57
回答 1查看 2.8K关注 0票数 2

我是Objective-C的新手。我正在尝试学习如何使用NSStream。我只是使用了来自Apple Support的简单代码。这段代码应该会从我的桌面中的文件中打开一个流,并在iStream调用委托时显示一条简单的消息。在代码的最后,我可以看到状态是正确的,但是委托永远不会被调用。我遗漏了什么?

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-03 03:03:25

run循环运行的时间不够长,无法调用委托方法。

添加:

代码语言:javascript
复制
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];

就在你打开小溪之后。这只在没有GUI的程序中是必需的--否则run循环将为您旋转。

如果您希望绝对确保在退出之前已调用了stream:handleEvent:,请在该方法中设置一个(全局)标志,并将runUntilDate:放入用于测试该标志的while循环中:

代码语言:javascript
复制
while( !delegateHasBeenNotified ){
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12238828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档