如何在后台自动请求?

时间:2015-01-30 06:43:20

标签: ios httprequest image-uploading lifecycle

我需要将图像上传到服务器,并且必须在后台请求用户按下主页按钮。

- (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:@"验证提交成功,等待审核"];

}

当我按下主页按钮时,它可能有效但有时可能会超时。当它失败时,它不会再次请求!如果请求是异步的,那么在我再次进入前台之前它将无法工作。 我该如何解决?

1 个答案:

答案 0 :(得分:0)

我把代码

[[UIApplication sharedApplication] endBackgroundTask:_uploadImageTask]; _uploadImageTask = UIBackgroundTaskInvalid;

在成功方法finish:中,似乎有效: enter image description here

如果有其他方法或问题,请告诉我,谢谢!