Eseguire NSRunLoop in un programma da riga di comando Cocoa

È ansible inizializzare un NSRunLoop senza caricare alcun file NIB (cioè senza chiamare NSApplicationMain() )?

Grazie.

Sì; è ansible scrivere il proprio metodo principale ed eseguire NSRunLoop senza tornare da NSApplicationMain .

Dai un’occhiata a questo link ; questo ragazzo sta usando NSRunLoop nel suo metodo principale, però non sta caricando i file NIB, ma dovrebbe andare con NSRunloops .

La soluzione è di richiamare manualmente NSApplication. Crea il tuo delegato dell’app prima di sostituire la chiamata NSApplicationMain () in main.m con quanto segue:

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

Il delegato sarà richiamato quando è pronto, senza bisogno di un pennino

 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 

In Swift, puoi ottenere ciò aggiungendo la seguente riga alla fine del tuo main.swift :

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

Se si desidera essere in grado di interrompere il ciclo di esecuzione, è necessario utilizzare i metodi della Core Foundation.

 CFRunLoopRun(); // start 

E puoi fermarlo così

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

Segui i consigli nei documenti per [Esecuzione NSRunLoop]:

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

Dai un’occhiata a asynctask.m che esegue manualmente un NSRunLoop per abilitare l’uso delle notifiche asincrone “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];