如何在后台iphone中定期调用Web服务?

时间:2012-05-21 17:46:04

标签: iphone objective-c ios

我有网络服务,我想定期从我的iPhone应用程序调用此服务,以便在应用程序运行时每1分钟兑现一次数据。

我使用 NSTimer 来调用调用此服务的函数,但是在第一次调用确实完成从第一次调用中解析数据然后再进行新调用之前,我感觉很糟糕。 那我该怎么办呢?

{
 NSDate *d = [NSDate dateWithTimeIntervalSinceNow: 60.0];
 NSTimer *t = [[NSTimer alloc] initWithFireDate: d
                                      interval: 10
                                        target: self
                                      selector:@selector(calltimer:)
                                      userInfo:nil repeats:YES];

 NSRunLoop *runner = [NSRunLoop currentRunLoop];
 [runner addTimer:t forMode: NSDefaultRunLoopMode];
 [t release];
}

-(void)calltimer :(id)sender
{
    NSLog(@"yessss");

    if(!myQueue)
    {
        myQueue = dispatch_queue_create("supperApp.user1025523.com", NULL);
        dispatch_async(myQueue, ^{
            [self getData]; 
            });
    }    
}

-(void)getData
{
    webserviceCaller* wsCaller = [[webserviceCaller alloc]initWithTarget:self     selector:@selector(parsINVData:)];
    [wsCaller getINventoryData:self.username];
    [wsCaller release];
}

-(void) parsINVData:(InvData*) ret
{
    //save return data in global variable      
}

我使用 NSMutableURLRequest 来启动请求参数,使用 NSURLConnection 来启动连接,以便为什么不会触发对Web服务的调用。

2 个答案:

答案 0 :(得分:2)

您可以添加类级别成员变量,如下所示:

<。>文件中的

{
    BOOL finishedParsing;
}

- (void) nsTimerFunctionCall
{
    if(!finishedParsing)
    {
        //Either return, or recall this same function after some time
        return;
    }

   [self parseCode];
}

- (void) parseCode
{
    finishedParsing = NO;

    //do long processing function
    //....

    finishedParsing = YES;
}

这样,您可以确保在处理另一个函数调用时不会调用解析代码

答案 1 :(得分:1)

使用串行队列确保一个任务等待下一个任务。

- (id)init
{
    self = [super init];
    if( !self ) return nil;

    parsing_queue = dispatch_queue_create("superApp.user1025523.com", NULL);

    // etc.

- (void)timerAction: (NSTimer *)tim
{
    // Enqueue the work. Each new block won't run until the 
    // previous one has completed.
    dispatch_async(parsing_queue, ^{
        // Do the work
    });
}

这也会在后台自动生成。