2014-09-21 3 views
0

내 앱의 데이터 업데이트를 위해 REST 서비스에 대한 동기 HTTP 요청을 정기적으로 수행합니다.iOS 백그라운드에서 이미 시작된 HTTP 호출 계속

__block BOOL result; 

      dispatch_queue_t queue = dispatch_queue_create(UpdateQueue, NULL); 
      dispatch_async(queue,^{ 

       UpdateMngr *updateMngr = [[UpdateMngr alloc] init]; 
       result = [updateMngr getUpdatedData]; 

       dispatch_async(dispatch_get_main_queue(), ^{ 
        if (result) { 
         // Notify user update is OK 
        } 
        else { 
         // Notify user update failed 
        } 
       }); 
      }); 

getUpdatedData 방법은 다음과 같습니다 : 응용 프로그램이 활성화되고 타이머가 완료되면 내가 전화를 할,이 코드 조각입니다

- (BOOL)getUpdatedData 
{ 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:self.serviceURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

NSURLResponse *response = nil; 
NSError *error = nil; 

NSData* jsonData = [self getRequestBody];  
[request setHTTPBody:jsonData]; 
NSData *content = [NSURLConnection sendSynchronousRequest:request 
             returningResponse:&response 
                error:&error]; 

if (([content length] > 0) && (error == nil)) { 
    id parseResult = [self parseJson:content]; 

    if ([parseResult isKindOfClass:[NSString class]]) { 
     return NO; 
    } 
    else if ([parseResult isKindOfClass:[NSDictionary class]]) { 
      @try { 
        // Success 
        // Save data in database 
      } 
      @catch (NSException *ex) { 
        // Handle error 
      } 
    } 
} 
else if (([content length] == 0) && (error == nil)) { 
    // No updated data 
    return NO; 
} 
else if (error != nil) { 
    return NO; 
} 

return YES; 
} 

것 같다 배경에 갈거나가는 그 예를 들어 들어오는 전화 통화로 인해 요청이 중단되고 서비스에서 수신 할 것으로 예상되는 데이터가 완전하지 않으며 그 중 일부만 사용자에게 표시되는 것처럼 앱이 작동하는 경우가 있기 때문에, 나는 응답을 받았지만.

백그라운드에서 유한 길이 작업을 실행하는 방법에 대해 iOS App Programming Guide 섹션을 읽었지 만 문서에있는 코드 스 니펫이 백그라운드에서 전체 작업을 시작한 것처럼 보이기 때문에 여기에 적용하는 방법을 모르겠습니다. 내가 필요한 것은 이미 시작된 작업을 완료하는 것입니다 ... 항상 백그라운드에서 작업을 수행해야합니까? 아니면이 시나리오를 어떻게 처리 할 수 ​​있습니까? 나는 이것이 아주 일반적인 시나리오가되어야한다고 생각하지만, 나에게 계몽적인 예나 튜토리얼을 찾지는 못한다.

참고 : 내 응용 프로그램은 아이폰 OS 5+를 위해 사전에

감사를 작동

편집 :self.bgTask@property UIBackgroundTaskIdentifier bgTask;

있는 적절한 솔루션?

- (void)getUpdates 
{ 
    self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
       // Clean up any unfinished task business by marking where you. 
       // stopped or ending the task outright. 
       [[UIApplication sharedApplication] endBackgroundTask:self.bgTask]; 
       self.bgTask = UIBackgroundTaskInvalid; 
      }]; 

    __block BOOL result; 

      dispatch_queue_t queue = dispatch_queue_create(UpdateQueue, NULL); 
      dispatch_async(queue,^{ 

       UpdateMngr *updateMngr = [[UpdateMngr alloc] init]; 
       result = [updateMngr getUpdatedData]; 

       dispatch_async(dispatch_get_main_queue(), ^{ 
        if (result) { 
         // Notify user update is OK 
        } 
        else { 
         // Notify user update failed 
        } 
       }); 
      }); 

    // Finish background task 
      if (self.bgTask != UIBackgroundTaskInvalid) { 
       [[UIApplication sharedApplication] endBackgroundTask:self.bgTask]; 
       self.bgTask = UIBackgroundTaskInvalid; 
      } 
} 

수 있을까요

+0

작업을 비동기 적으로 실행하므로 백그라운드 스레드에서 실행되는 전체 코드 세트를 갖게됩니다. 애플리케이션에 대한 정보를 말하는 관점에서 '배경'작업을 시작한다고해서 앱이 포 그라운드 앱으로 상태를 잃지 않으면 다르게 실행된다는 의미는 아닙니다. 당신은 '배경'의 여러 의미의 차이점을 보았습니까? – Wain

+0

@Wain 당신 말이 맞아요 ... 내가 여기'배경'이라고 말할 때, 배경에있는 앱을 의미하는 것입니다. (또는 비활성 ...) – AppsDev

+0

적절한 경우 배경에있는 앱을 다루기 위해 코드를 작성하지만 작업을 생성하기 전에 실제로 백그라운드에 있는지 확인할 필요가 없습니다. – Wain

답변

0

코드가 닫습니다. 백그라운드 작업이 시작된 후 즉시 완료되기 때문에 문제가 발생합니다 (메서드 내부에서 수행 되었기 때문에 완료되었지만 비동기 블록 내부에서는 수행되지 않았기 때문에). 이것을 시도하십시오 :

- (void)getUpdates 
{ 
    self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
      // Clean up any unfinished task business by marking where you. 
      // stopped or ending the task outright. 
      [[UIApplication sharedApplication] endBackgroundTask:self.bgTask]; 
      self.bgTask = UIBackgroundTaskInvalid; 
     }]; 

     __block BOOL result; 

     dispatch_queue_t queue = dispatch_queue_create(UpdateQueue, NULL); 
     dispatch_async(queue,^{ 

      UpdateMngr *updateMngr = [[UpdateMngr alloc] init]; 
      result = [updateMngr getUpdatedData]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       if (result) { 
        // Notify user update is OK 
       } 
       else { 
        // Notify user update failed 
       } 

       // Finish background task 
       if (self.bgTask != UIBackgroundTaskInvalid) { 
        [[UIApplication sharedApplication] endBackgroundTask:self.bgTask]; 
        self.bgTask = UIBackgroundTaskInvalid; 
       } 
      }); 
     }); 
} 
관련 문제