使用iOS Dropbox SDK进行核心数据的分块上传

我有一个iOS应用程序,使用核心数据持久性数据存储。 我将Dropbox集成为用户执行持久性存储文件(appname.sqlite)的备份的一种方式。

UIButton调用一个方法来查看一个文件是否已经存在于Dropbox上:

if([[DBSession sharedSession]isLinked]) { NSString *folderName = [[self.dateFormatter stringFromDate:[NSDate date]] stringByReplacingOccurrencesOfString:@"/" withString:@"-"]; NSString *destinationPath = [NSString stringWithFormat:@"/GradeBook Pro/Backup/%@/",folderName]; self.metadataIndex = METADATA_REQUEST_BACKUP; [self.restClient loadMetadata:destinationPath]; } 

loadedMetadata委托方法使用现有文件的rev编号(如果存在)启动上载。

 -(void) restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata { SAVE_CORE_DATA; NSString *folderName = [[self.dateFormatter stringFromDate:[NSDate date]] stringByReplacingOccurrencesOfString:@"/" withString:@"-"]; NSString *documentsDirectory = DOCUMENTS_DIRECTORY; NSString *sourcePath = [NSString stringWithFormat:@"%@/GradeBookPro.sqlite", documentsDirectory]; NSString *destinationPath = [NSString stringWithFormat:@"/GradeBook Pro/Backup/%@/",folderName]; [self.restClient uploadFile:@"GradeBookPro.sqlite" toPath:destinationPath withParentRev:[[metadata.contents lastObject]rev] fromPath:sourcePath]; } 

这适用于合理的小文件或完美的networking连接的大文件,但上传过程中的任何小错误取消整个过程。 我想切换到使用分块的上传方法,但我不知道如何实际上做“.sqlite文件”的分块。

我似乎无法find任何正在使用分块上载的示例应用程序,我可以从中学习和文档只是说,以块提供文件。

所以,我的问题是:

  1. 分块上传正确的方法来解决上传大型文件通过可能多点networking连接的用户问题?

  2. 你可以指点我的代码/应用程序/文件“分块”的文件? 我对Dropbox SDK很满意。

谢谢!

我会自己回答这个问题,以防其他人有同样的问题。

事实certificate,我正在使这种方式比它所需要的更困难。 Dropbox SDK处理分块文件,所以我只需要启动传输并对委托调用做出反应。 使用的方法是:

要发送文件块 – 对于第一个块,请将upload用于零,0用于offset:

 - (void)uploadFileChunk:(NSString *)uploadId offset:(unsigned long long)offset fromPath:(NSString *)localPath; 

在发送最后一个块之后,使用这个方法来提交上传:

 - (void)uploadFile:(NSString *)filename toPath:(NSString *)parentFolder withParentRev:(NSString *)parentRev fromUploadId:(NSString *)uploadId; 

我处理委托方法如下:

  - (void)restClient:(DBRestClient *)client uploadedFileChunk:(NSString *)uploadId newOffset:(unsigned long long)offset fromFile:(NSString *)localPath expires:(NSDate *)expiresDate { unsigned long long fileSize = [[[NSFileManager defaultManager]attributesOfItemAtPath:[FileHelper localDatabaseFilePath] error:nil]fileSize]; if (offset >= fileSize) { //Upload complete, commit the file. [self.restClient uploadFile:DATABASE_FILENAME toPath:[FileHelper remoteDatabaseDirectory] withParentRev:self.databaseRemoteRevision fromUploadId:uploadId]; } else { //Send the next chunk and update the progress HUD. self.progressHUD.progress = (float)((float)offset / (float)fileSize); [self.restClient uploadFileChunk:uploadId offset:offset fromPath:[FileHelper localDatabaseFilePath]]; } } 

由于我试图解决的主要问题是处理不良的连接我实施失败的块上传的委托方法:

 - (void)restClient:(DBRestClient *)client uploadFileChunkFailedWithError:(NSError *)error { if (error != nil && (self.uploadErrorCount < DROPBOX_MAX_UPLOAD_FAILURES)) { self.uploadErrorCount++; NSString* uploadId = [error.userInfo objectForKey:@"upload_id"]; unsigned long long offset = [[error.userInfo objectForKey:@"offset"]unsignedLongLongValue]; [self.restClient uploadFileChunk:uploadId offset:offset fromPath:[FileHelper localDatabaseFilePath]]; } else { //show an error message and cancel the process } }