내 앱의 데이터 업데이트를 위해 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;
}
}
수 있을까요
작업을 비동기 적으로 실행하므로 백그라운드 스레드에서 실행되는 전체 코드 세트를 갖게됩니다. 애플리케이션에 대한 정보를 말하는 관점에서 '배경'작업을 시작한다고해서 앱이 포 그라운드 앱으로 상태를 잃지 않으면 다르게 실행된다는 의미는 아닙니다. 당신은 '배경'의 여러 의미의 차이점을 보았습니까? – Wain
@Wain 당신 말이 맞아요 ... 내가 여기'배경'이라고 말할 때, 배경에있는 앱을 의미하는 것입니다. (또는 비활성 ...) – AppsDev
적절한 경우 배경에있는 앱을 다루기 위해 코드를 작성하지만 작업을 생성하기 전에 실제로 백그라운드에 있는지 확인할 필요가 없습니다. – Wain