2012-05-21 3 views
0

웹 서비스가 있고 응용 프로그램이 실행될 때마다 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  
} 

나는 웹 서비스에 대한 호출이 발생하지 않았다 왜 그렇게 연결을 시작하도록 요청 매개 변수와 있는 NSURLConnection을 시작 NSMutableURLRequest를 사용합니다.

+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

OK 나는 당신이 말하는 것을하지만 URL을 호출하는 함수는 서버를 호출하지 않았다. 내 코드로 게시물을 업데이트한다. – user1025523

+0

지금 고맙다. – user1025523

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

당신은 구문 분석 코드가 호출되지 않도록 할 수 있습니다이 방법 .H 파일에

동안 함수에 다른 전화 처리 됨

관련 문제