Execute o NSRunLoop em um programa de linha de comando Cocoa

É possível inicializar um NSRunLoop sem carregar nenhum arquivo NIB (ou seja, sem chamar NSApplicationMain() )?

Obrigado.

Sim; você pode escrever seu próprio método principal e executar o NSRunLoop sem retornar do NSApplicationMain .

Dê uma olhada neste link ; Esse cara está usando o NSRunLoop em seu método principal, mas ele não está carregando arquivos NIB, mas você deve ir com o NSRunloops .

A solução é invocar o NSApplication manualmente. Crie seu delegado de aplicativo primeiro que substitua a chamada NSApplicationMain () em main.m pelo seguinte:

 AppDelegate * delegate = [[AppDelegate alloc] init]; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSApplication * application = [NSApplication sharedApplication]; [application setDelegate:delegate]; [NSApp run]; [pool drain]; [delegate release]; 

O delegado será chamado quando estiver pronto, sem precisar de um aparo

 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 

No Swift, você pode conseguir isso anexando a seguinte linha ao final do seu main.swift :

 NSRunLoop.currentRunLoop().run(); // Swift < 3.0 RunLoop.current.run(); // Swift >= 3.0 

Se você quiser interromper o loop de execução, use os methods da Core Foundation.

 CFRunLoopRun(); // start 

E você pode pará-lo assim

 CFRunLoopStop(CFRunLoopGetCurrent()); // stop 
 // Yes. Here is sample code (tested on OS X 10.8.4, command-line). // Using ARC: // $ cc -o timer timer.m -fobjc-arc -framework Foundation // $ ./timer // #include  @interface MyClass : NSObject @property NSTimer *timer; -(id)init; -(void)onTick:(NSTimer *)aTimer; @end @implementation MyClass -(id)init { id newInstance = [super init]; if (newInstance) { NSLog(@"Creating timer..."); _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(onTick:) userInfo:nil repeats:YES]; } return newInstance; } -(void)onTick:(NSTimer *)aTimer { NSLog(@"Tick"); } @end int main() { @autoreleasepool { MyClass *obj = [[MyClass alloc] init]; [[NSRunLoop currentRunLoop] run]; } return 0; } 

Siga as recomendações nos documentos para [execução do NSRunLoop]:

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

Dê uma olhada no asynctask.m que executa um NSRunLoop manualmente para ativar o uso de notifications “waitForDataInBackgroundAndNotify” assíncronas.

http://www.cocoadev.com/index.pl?NSPipe

  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; while(!terminated) { //if (![[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:100000]]) if (![[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) { break; } [pool release]; pool = [[NSAutoreleasePool alloc] init]; } [pool release];