2012-05-21 43 views
0

我有Web服務,我想定期從我的iPhone應用程序中調用此服務,以在應用程序運行時每隔1分鐘收集一次數據。如何在後臺iphone中定期調用webservice?

我使用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服務不火。

+0

更清潔將是不設置您的計時器重複。然後,當您收到或失敗(在NSURLConnection委託方法中)時,您可以重新安排計時器。 – EricLeaf

+0

這段代碼工作正常嗎? – Ramz

回答

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

這也自動在後臺。

+0

好吧,我做你說什麼,但調用URL的功能沒有調用服務器我更新與我的代碼的帖子 – user1025523

+0

感謝它現在工作 – user1025523

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

這種方式可以確保解析代碼就不會被調用

而另一個調用該函數處理

相關問題