我需要将图像上传到服务器,并且必须在后台请求用户按下主页按钮。
- (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:@"验证提交成功,等待审核"];
}
当我按下主页按钮时,它可能有效但有时可能会超时。当它失败时,它不会再次请求!如果请求是异步的,那么在我再次进入前台之前它将无法工作。 我该如何解决?
答案 0 :(得分:0)
我把代码
[[UIApplication sharedApplication] endBackgroundTask:_uploadImageTask];
_uploadImageTask = UIBackgroundTaskInvalid;
在成功方法finish:
中,似乎有效:
如果有其他方法或问题,请告诉我,谢谢!