2017-10-20 7 views
0

배경 여러 URL을 반복적으로 다운로드하여 여러 파일을 다운로드했습니다. 파일을 다운로드 할 때 파일에서 JSON을 압축 해제하고 SQLite 데이터베이스에 데이터를 삽입해야합니다. 파일이 나는 데이터베이스에 파일의 내용을 삽입하려고하고 파일을 비동기 적으로 다운로드하고 파일이 두 번째 파일은 첫번째 전에 데이터베이스에 삽입 취득하려고 다른 크기 때문에 다운로드비동기식으로 다운로드 한 파일의 내용을 SQLite에 저장

문제 파일이 완료되었으므로 데이터베이스가 후속 파일에 대해 잠겨 있습니다.

QUESTION 다음 파일을 저장하기 전에 이전 파일이 데이터베이스에 저장되기를 기다리는 방법은 무엇입니까?

코드 파일을 얻을 수 있습니다 :

-(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 @ 데이터베이스 – schmidt9

+0

에 나는 '에 저장할 이동 데이터베이스 '코드 아웃, 파일을 저장하기 전에 몇 초가 걸릴 파일 다운로드가 끝나기 전에 실행됩니다. – Ryan

답변

0

는 GCD (그랜드 센트럴 파견)에서 직렬 큐를 사용합니다. 일부 검증되지 않은 코드 :

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() 
} 
+0

나는 항상 DispatchQueue에서 saveJsonToSql 메서드 호출을 래핑했으며 데이터베이스는 여전히 잠긴 상태입니다. – Ryan

+0

dispatch_async 대신 dispatch_sync를 시도하십시오. –