2009-03-24 3 views

답변

94

NSData 당신이 원하는 정확히 않는 writeToURL:atomically:라는 방법이 있습니다 (I 이미 NSURL file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes했습니다). 그것을 사용하는 방법을 보려면 the documentation for NSData을보십시오.

+1

은 엔디안 문제에 대해 조심. –

+1

'NSData' 객체의 소스가이 메소드에 중요합니까? [이 질문에] (http://stackoverflow.com/questions/16150196/updating-sqlite-database-without-xml) URL에서'NSData' 개체로 다운로드 한 .sqlite 데이터베이스를 저장하고 있지만 올바르게 저장하지 않는 것 같습니다. 파일이 작성되었지만, 제 앱이나 타사 뷰어를 통해 액세스하려고하면 유효한 SQLite 데이터베이스가 아니라고 알려줍니다. 'writeToURL : atomically :'는'NSString' 또는 그와 비슷한 것을 저장하기 위해서만 작동합니까? – GeneralMike

+1

'NSData'는 모든 종류의 이진 데이터 래퍼입니다. 원래 소스는 중요하지 않습니다. 귀하의 질문을보고,'NSWRLConnection' (또는'AFNetworking'과 같은 라이브러리)를 사용하여'initWithContentsOfURL :'을 통해 권하고 싶습니다. 작은 다운로드의 경우 NSData는 정상적으로 작동하지만 다운로드를 제어하지 못합니다. 문제가 발생하면 문제를 진단하기가 어렵습니다. – Alex

30

writeToURL:atomically: 또는 writeToFile:atomically: 당신이 대신 URL의 파일 이름이있는 경우. 파일에 NSData를 작성

+2

+1에 대한 NSURL. NSURL은 파일을 가리킬 때 NSString을 pwn합니다. Apple은 항상 NSString이 아닌 파일 경로에 대해 NSURL을 권장합니다. :) –

+9

writeToURL과 writeToFile의 차이점이 있다고 생각하지 않습니다. 문서에 따르면 "현재 전용 파일에서 이후 : // URL이 지원됩니다,이 방법 writeToFile 사이에는 차이가 없습니다 : 원자 :, 첫 번째 인수의 유형을 제외하고" –

+0

는'NSData' 객체 문제의 원인을합니까 이 방법 은요? 나는이 URL에서'NSData' 객체로 다운로드 한 .sqlite 데이터베이스를 저장하고있어 (http://stackoverflow.com/questions/16150196/updating-sqlite-database-without-xml)이 질문에,하지만 올바르게 저장하지 않는 것 같습니다. 파일이 작성되었지만, 제 앱이나 타사 뷰어를 통해 액세스하려고하면 유효한 SQLite 데이터베이스가 아니라고 알려줍니다. 'writeToURL : atomically :'는'NSString' 또는 그와 비슷한 것을 저장하기 위해서만 작동합니까? – GeneralMike

28

공지 사항은 메인 스레드를 차단할 수있는 IO 작업입니다. 특히 데이터 객체가 큰 경우.

// Use GCD's background queue 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    // Generate the file path 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"yourfilename.dat"]; 

    // Save it into file system 
    [data writeToFile:dataPath atomically:YES]; 
}); 
+1

검색하는 방법은 무엇입니까? –

+0

[dataWithContentsOfFile''(https://developer.apple.com/documentation/foundation/nsdata/1547226-datawithcontentsoffile?language=objc) – Rob

0

을 또한 writeToFile:options:error: 또는 writeToURL:options:error:이 경우 절약의에서 오류 코드를보고 할 수있는이 다음과 같이

따라서는 백그라운드 스레드에서이 작업을 수행하는 것이 좋습니다, 가장 쉬운 방법은 GCD를 사용하는 것 어떤 이유로 든 NSData이 실패했습니다. 예를 들어 :

NSError *error; 

NSURL *folder = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:true error:&error]; 
if (!folder) { 
    NSLog(@"%s: %@", __FUNCTION__, error);  // handle error however you would like 
    return; 
} 

NSURL *fileURL = [folder URLByAppendingPathComponent:filename]; 
BOOL success = [data writeToURL:fileURL options:NSDataWritingAtomic error:&error]; 
if (!success) { 
    NSLog(@"%s: %@", __FUNCTION__, error);  // handle error however you would like 
    return; 
}