Загрузка файлов в фоновом режиме
У меня есть два представления: myFristView и mySecondView, в myFristView у меня есть код, который может прочитать поля в моей базе данных, а затем отправить на сервер PHP, этот код NSInvocationOperation с помощью этого класса для отправки файлов в фоновом режиме.
Процесс отправки файлов на сервер немного медленный (поскольку в базе данных много записей), вам часто приходится ждать, пока все отправляемые файлы попадут в mySecondView, это произошло потому, что помимо того, что я использую ARC, в предыдущем представлении перестает работать, и приложение фокусируется на втором представлении, делая остановку отправки файлов.
Поэтому я хотел бы найти способ: когда я покидаю экран (myFristView), приложение продолжает выполнять команду, в которой файлы отправляются на сервер PHP.
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(sendFiles) object:nil];
[queue addOperation:operation];
-(void)sendFiles{
......
NSString *urlString = @"http://www.website.com/receiveFiles.php";
NSString *filename = @"fazerbem.sqlite";
request= [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *postbody = [NSMutableData data];
[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@.jpg\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[NSData dataWithData:YOUR_NSDATA_HERE]];
[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postbody];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSLog(@"%@", returnString);
}
1 ответ
Я использую это для загрузки видео.
Сначала объявите свойство фоновой задачи:
@property UIBackgroundTaskIdentifier backgroundUploadingID;
Настройка фоновой задачи:
UIApplication *app = [UIApplication sharedApplication];
self.backgroundUploadingID = [app beginBackgroundTaskWithExpirationHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
if (self.backgroundUploadingID != UIBackgroundTaskInvalid)
{
UILocalNotification *alert = [[UILocalNotification alloc] init];
[alert setAlertBody:@"Video Upload Timed Out"];
[[UIApplication sharedApplication] presentLocalNotificationNow:alert];
[app endBackgroundTask:self.backgroundUploadingID];
self.backgroundUploadingID = UIBackgroundTaskInvalid;
}
});
}];
Не забудьте отключить его, когда задача завершена:
if (self.backgroundUploadingID != UIBackgroundTaskInvalid)
{
// NSLog(@"Ending backgrounding");
UIApplication *app = [UIApplication sharedApplication];
[app endBackgroundTask:self.backgroundUploadingID];
self.backgroundUploadingID = UIBackgroundTaskInvalid;
}