Проверяйте состояние в фоновом режиме каждые десять секунд и отправляйте уведомления - PullRequest
1 голос
/ 17 мая 2011

Я работаю над приложением для Mac OS X. Мое приложение проверяет что-то каждые десять секунд, и если условие выполняется, приложение отправляет уведомление Growl.

Я уже кодировал Growlуведомления и проверка.Мне просто нужно знать, как заставить эту проверку повторяться каждые десять секунд, и каждый раз отправлять уведомление, если оно истинно, все в фоновом режиме.

Пожалуйста, напишите точный код, так как я очень плохо знаком с Objective-C.Спасибо: D

------------------------------- РЕДАКТИРОВАТЬ ------------------------------------

В настоящее время я использую это:

//  MyApp_AppDelegate.m

#import "MyApp_AppDelegate.h"

@implementation MyApp_AppDelegate

- (void)awakeFromNib {
    return;
}


-(void)applicationDidFinishLaunching:(NSNotification*)aNotification {

    // grwol:
    NSBundle *myBundle = [NSBundle bundleForClass:[MyApp_AppDelegate class]];
    NSString *growlPath = [[myBundle privateFrameworksPath] stringByAppendingPathComponent:@"Growl-WithInstaller.framework"];
    NSBundle *growlBundle = [NSBundle bundleWithPath:growlPath];

    #include <unistd.h>

    int x = 0;
    int l = 10; // time/repeats
    int t = 10; //seconds
    while ( x <= l ) {

        // more code here only to determine sendgrowl value...

        if(sendgrowl) {
            if (growlBundle && [growlBundle load]) {
                // more code to sends growl
            } else {
                NSLog(@"ERROR: Could not load Growl.framework");
            }
        }

        // do other stuff that doesn't matter...

        // wait:
        sleep(t);

        x++;
    }
}

/* Dealloc method */
- (void) dealloc { 
    [super dealloc]; 
}

@end

Ответы [ 3 ]

1 голос
/ 17 мая 2011

Точный код, который вы ищете, можно найти здесь: Темы программирования времени

0 голосов
/ 17 мая 2011

Чтобы запланировать запуск таймера каждые 10 секунд, вам необходимо:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: 10.0
                                                  target: someObject 
                                                selector: @selector(fire:)
                                                userInfo: someParameter
                                                 repeats: YES];

Это создаст таймер и поместит его в цикл выполнения так, чтобы он срабатывал каждые 10 секунд. Когда он запускается, это эквивалентно следующему вызову метода:

[someObject fire: someParameter];

Вам разрешено передавать nil как someParameter, и в этом случае вашему селектору не нужно принимать параметр, т.е. это может быть -fire вместо -fire:.

Чтобы остановить таймер, просто отправьте ему сообщение invalidate.

[timer invalidate];

Для работы таймеров необходим цикл запуска. Это нормально, если вы запускаете его в главном потоке вашего приложения, так как основной поток уже имеет цикл выполнения (именно он обрабатывает события пользовательского интерфейса и передает их вашим действиям). Если вы хотите, чтобы таймер срабатывал в другом потоке, вы должны создать и запустить цикл выполнения в этом другом потоке. Это немного сложнее, так что если вы новичок в Objective-C, избегайте этого пока.


Редактировать

Увидев, что вы пытаетесь сделать, первый бит кода для планирования таймера должен заменить весь цикл while. Метод -fire будет выглядеть примерно так:

-fire
{
    // code here only to determine sendgrowl value...

    if(sendgrowl) 
    {
        if (growlBundle && [growlBundle load]) 
        {
            // more code to sends growl
        }
        else 
        {
            NSLog(@"ERROR: Could not load Growl.framework");
        }
    }
    // do other stuff that doesn't matter...
}
0 голосов
/ 17 мая 2011
-(void) sendGrowl { } // your growl method

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self 
                  selector:@selector(sendGrowl) userInfo:nil repeats:YES]; 

Когда вы закончите с вызовом по таймеру [timer invalidate].Вставьте в XCode и нажмите Alt +, чтобы прочитать документы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...