Objective c 在命令行程序中运行nsrunlop

Objective c 在命令行程序中运行nsrunlop,objective-c,cocoa,Objective C,Cocoa,是否可以在不加载任何NIB文件的情况下(即不调用NSApplicationMain())初始化nsrunlop 谢谢。是的;您可以编写自己的main方法并运行nsrunlop,而无需从NSApplicationMain返回 看看这个,;这家伙在他的主要方法中使用nsrunlop,虽然他没有加载NIB文件,但它应该可以让您使用nsrunlops解决方案是手动调用NSApplication。首先创建应用程序委托,然后将main.m中的NSApplicationMain()调用替换为以下内容: App

是否可以在不加载任何NIB文件的情况下(即不调用
NSApplicationMain()
)初始化
nsrunlop


谢谢。

是的;您可以编写自己的main方法并运行
nsrunlop
,而无需从
NSApplicationMain
返回


看看这个,;这家伙在他的主要方法中使用nsrunlop,虽然他没有加载NIB文件,但它应该可以让您使用
nsrunlops

解决方案是手动调用NSApplication。首先创建应用程序委托,然后将main.m中的NSApplicationMain()调用替换为以下内容:

AppDelegate * delegate = [[AppDelegate alloc] init];

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSApplication * application = [NSApplication sharedApplication];
[application setDelegate:delegate];
[NSApp run];

[pool drain];

[delegate release];
委托将在准备就绪时调用,而不需要nib

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

请查看手动运行nsrunlop的asynctask.m 启用异步“waitForDataInBackgroundAndNotify”通知的使用

//是的。下面是示例代码(在OSX10.8.4命令行上测试)。
//使用ARC:
//cc-O定时器计时器。
//美元/计时器
//
#包括
@接口MyClass:NSObject
@属性NSTimer*计时器;
-(id)init;
-(void)onTick:(NSTimer*)aTimer;
@结束
@MyClass的实现
-(id)init{
id newInstance=[super init];
if(newInstance){
NSLog(@“创建计时器…”);
_计时器=[NSTimer scheduledTimerWithTimeInterval:1.0
目标:自我
选择器:@选择器(点击:)
用户信息:无
重复:是];
}
返回newInstance;
}
-(void)onTick:(NSTimer*)aTimer{
NSLog(@“勾选”);
}
@结束
int main(){
@自动释放池{
MyClass*obj=[[MyClass alloc]init];
[[nsrunlop currentRunLoop]run];
}
返回0;
}

遵循文档中关于[nsrunlop run]的建议:

BOOL shouldKeepRunning = YES;        // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate     distantFuture]]);

在Swift中,您可以通过在
main.Swift的末尾追加以下行来实现此目的:

NSRunLoop.currentRunLoop().run();  // Swift < 3.0
RunLoop.current.run();             // Swift >= 3.0
你可以这样阻止它

CFRunLoopStop(CFRunLoopGetCurrent()); // stop

为什么要在CLI应用程序中加载运行循环?为什么要在CLI应用程序中加载nib文件?bertolami:我想他的意思是不加载。@KennyTM:这样做的一个原因可能是使用需要运行循环的功能,如CoreLocation(以及其他各种功能),但是天生没有任何GUI需求。@KennyTM-他可能想在
main
中创建
NSURLConnection
。如果没有任何特殊处理,他可以在程序真正完成之前退出
main
,因为委托被调用了;这一切都可以通过nsrunlop完成。因此,虽然这对某些人来说可能是有用的信息,但我认为这是一个不恰当的答案。出于这个原因,我使用了[[nsrunlop currentRunLoop]run];在我的GUI较少的应用程序中,但我的应用程序将进入无响应状态。这个方法对我来说很好。对于ARC,删除[delegate release]、[pool drain]和NSAutoreleasePool,并将@autoreleasepool{}放在所有代码的周围。另请参见:官方网站This is great。。。但现在我不知道如何停止。你对我有什么建议吗?需要更多的解释-当我尝试它时,while()在结束日期之前从不存在(当它设置为distantFuture时,它只是不存在以检查shouldKeepRunning)。我试图从runloop中删除所有内容,但没有成功。CFRunnLoopStop()崩溃,并且。。。。好。。。需要更多的解释。这不符合预期。您好,您是否在运行循环中已计划的某个时间点设置shouldKeepRunning=NO?在进入这个while循环之前,您必须在runloop上安排一些事情。祝你好运
NSRunLoop.currentRunLoop().run();  // Swift < 3.0
RunLoop.current.run();             // Swift >= 3.0
CFRunLoopRun(); // start
CFRunLoopStop(CFRunLoopGetCurrent()); // stop