每隔十秒检查后台状况并发送通知

时间:2011-05-17 13:39:51

标签: objective-c cocoa macos background

我正在开发适用于Mac OS X的应用程序。我的应用程序每10秒检查一次,如果条件为真,应用程序会发送Growl通知。

我已经编写了Growl通知和检查。我只需要知道如何使这个检查每十秒重复一次,并且每次都发送通知,如果是,则全部在后台。

请写下确切的代码,因为我对Objective-C很新。谢谢:D

------------------------------- EDIT --------------- ---------------------

目前我正在使用它:

//  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 个答案:

答案 0 :(得分:1)

您可以在此处找到您要查找的确切代码: Time Programming Topics

答案 1 :(得分:0)

-(void) sendGrowl { } // your growl method

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

完成定时器调用[timer invalidate]后。粘贴到XCode并按住Alt并单击它以阅读文档。

答案 2 :(得分:0)

要安排计时器每10秒运行一次,您需要:

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

这将创建一个计时器并将其置于运行循环中,使其每10秒触发一次。当它触发时,它等同于以下方法调用:

[someObject fire: someParameter];

您可以将{n}传递给someParameter,在这种情况下,您的选择器不需要参数,即-fire而不是-fire:

要停止计时器,只需发送invalidate消息。

[timer invalidate];

计时器需要运行循环才能工作。如果你在应用程序的主线程上运行它,这很好,因为主线程已经有一个运行循环(它处理UI事件并将它们传递给你的动作)。如果您希望计时器在另一个线程上触发,则必须在该不同的线程上创建并运行一个运行循环。这是一个更高级的,所以鉴于你是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...
}