2017-10-20 138 views
0

背景我正在循环访问一堆URL以获取多个文件。当文件被下载时,我需要从文件中'解压'JSON并将数据插入到SQLite数据库中。将异步下载文件的内容保存到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]; 
+0

先写,然后到磁盘上的所有文件,数据库 – schmidt9

+0

@ schmidt9当我移动“保存到数据库'代码出来,它会在文件下载完成之前运行,因为这些文件需要几秒钟才能保存。 – Ryan

回答

0

从GCD(大中央调度)使用串行队列。一些未经测试的代码:

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

和东西有点SWIFTY-ER对于那些劝说:

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

我已经在DispatchQueue中包装了saveJsonToSql方法调用,并且数据库仍然被锁定,但并非总是如此。 – Ryan

+0

尝试dispatch_sync而不是dispatch_async。 –