Мне нужно загрузить изображение на сервер и запросить его в фоновом режиме, если пользователь нажал кнопку «домой».Как автоматически запросить в фоновом режиме?
- (void)uploadImage
{
AppDelegate * app = (AppDelegate *)[UIApplication sharedApplication].delegate;
[app.uploadAndDownManager uploadIDImageWithImage:_im.image];
}
-(void)uploadIDImageWithImage:(UIImage *)image
{
if (!_uploadImage) {
_uploadImage = image;
}
[self uploadImageInBackground];
}
- (void)uploadImageInBackground
{
_uploadImageTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:_uploadImageTask];
_uploadImageTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task, preferably in chunks.
// your code
// NSLog(@" %f",[UIApplication sharedApplication].backgroundTimeRemaining);
[self test];
[[UIApplication sharedApplication] endBackgroundTask:_uploadImageTask];
_uploadImageTask = UIBackgroundTaskInvalid;
});
}
-(void)test
{
NSString * userStr = [[NSUserDefaults standardUserDefaults] objectForKey:@"userName"];
NSString * portNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"portNumber"];
NSString * urlStr = URL_ADDRESS(portNumber, @"uploadAction_execute.action");
NSURL * url = [NSURL URLWithString:urlStr];
NSData * data = UIImageJPEGRepresentation(_uploadImage, 0.8);
//保存本地
[self saveToLocalDocument:data];
ASIFormDataRequest * re = [ASIFormDataRequest requestWithURL:url];
re.delegate = self;
[re setData:data withFileName:[NSString stringWithFormat:@"%@_id_.jpg",userStr] andContentType:@"image/jpg" forKey:@"file"];
[re setRequestMethod:@"POST"];
[re setDidFinishSelector:@selector(finish:)];
[re setDidFailSelector:@selector(failed:)];
// [re startAsynchronous];
[re startSynchronous];
}
В случае неудачен запрос, я позволяю это просить автоматически:
- (void)failed:(ASIFormDataRequest *)request
{
NSLog(@"error %@",request.error);
[self performSelector:@selector(uploadIDImageWithImage:) withObject:nil afterDelay:REQUEST_AGAIN_TIME];
// [SVProgressHUD showImage:nil status:@"验证提交成功,等待审核"];
}
При нажатии на кнопку домой, он может работает, но это может быть вне времени иногда. Когда он терпит неудачу, он не будет запрашивать еще раз! Если запрос будет асинхронным, он не будет работать, пока я снова не перейду на передний план. Как я могу это исправить?