0

我有网络服务,我想定期从我的 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 服务的调用没有触发。

4

2 回答 2

2

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

在 .h 文件中

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

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

于 2012-05-21T18:43:15.930 回答
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
    });
}

这也会在后台自动进行。

于 2012-05-21T19:05:02.517 回答