2017-10-20 379 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。 –