将异步下载的文件内容保存到 SQLITE
Saving asynchronously downloaded files' contents to SQLITE
BACKGROUND 我正在循环访问一堆 URL 以下载多个文件。下载文件后,我需要从文件中 'unpack' 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()
}
BACKGROUND 我正在循环访问一堆 URL 以下载多个文件。下载文件后,我需要从文件中 'unpack' 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()
}