将异步下载的文件内容保存到 SQLITE



背景我正在循环浏览一堆URL以下载几个文件。下载文件时,我需要从文件中"解包"JSON,并将数据插入SQLite数据库。

问题下载文件时,我试图将文件的内容插入数据库,因为文件是异步下载的,并且文件大小不同,所以第二个文件试图在第一个文件完成之前插入数据库,因此数据库会为后续文件锁定。

问题如何让文件等待上一个文件保存到数据库,然后再尝试保存下一个?

获取文件的代码:

-(void)downloadJsonDataFrom:(NSURL *)url withToken:(NSString*)token saveTo:(NSString *)saveLocation withName:(NSString*)fileName
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
[request addValue:@"application/json" forHTTPHeaderField:(@"content-type")];
[request addValue:token forHTTPHeaderField:(@"X-TOKEN")]; 
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:nil delegateQueue:nil];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * data, NSURLResponse * response, NSError * error) {
if (!error && data) {
NSError *writeError = nil;
BOOL writeOK = [data writeToFile:saveLocation options:NSDataWritingAtomic error:&writeError];
if (writeOK) {
NSLog(@"downloadTheFileFrom writeOK for %@", fileName);
[sqlFileHandler saveJsonToSql:saveLocation];
} else {
NSLog(@"Error writing file : %@ %@", fileName, writeError);
}

} else {
NSLog(@"downloadTheFileFrom Error : %@",error);
}
}];
[dataTask resume];

使用来自GCD(Grand Central Dispatch)的串行队列。一些未经测试的代码:

dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.sql.queue", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
[sqlFileHandler saveJsonToSql:saveLocation];
}); 

对于那些有说服力的人来说,还有一个更快的东西:

let serialQueue = DispatchQueue(label: "com.unique.sql.queue", attr: DISPATCH_QUEUE_SERIAL)
serialQueue.sync { 
operationThatNeedsToRunSerially()
}

相关内容

  • 没有找到相关文章

最新更新