Ejecute NSRunLoop en un progtwig de línea de comandos de Cocoa

¿Es posible inicializar un NSRunLoop sin cargar ningún archivo NIB (es decir, sin llamar a NSApplicationMain() )?

Gracias.

Sí; puede escribir su propio método principal y ejecutar NSRunLoop sin regresar de NSApplicationMain .

Eche un vistazo a este enlace ; este tipo está usando NSRunLoop en su método principal, aunque no está cargando archivos NIB, pero debería funcionar con NSRunloops .

La solución es invocar NSApplication manualmente. Cree su delegado de aplicación primero que reemplace la llamada NSApplicationMain () en main.m con lo siguiente:

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

El delegado se invocará cuando esté listo, sin necesidad de una punta

 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 

En Swift, puede lograr esto agregando la siguiente línea al final de su main.swift :

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

Si desea poder detener el ciclo de ejecución, debe usar los métodos de Core Foundation.

 CFRunLoopRun(); // start 

Y puedes detenerlo así

 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 las recomendaciones en los documentos para [ejecutar NSRunLoop]:

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

Eche un vistazo a asynctask.m que ejecuta un NSRunLoop manualmente para habilitar el uso de notificaciones asincrónicas de “waitForDataInBackgroundAndNotify”.

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];