2009-03-24 28 views
61
NSData *data; 
data = [self fillInSomeStrangeBytes]; 

Sorum için NSData yazmak için en kolay yolu Bir dosyanın en kolay yolu üzerinde bu data yazabilirsiniz nasıl şimdi.bir dosyaya

cevap

94

NSData yapmak istediğiniz tam olarak ne yapar writeToURL:atomically: adlı bir yöntem vardır (Zaten bir NSURL file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes ettik). Nasıl kullanılacağını görmek için the documentation for NSData'a bakın.

+1

endian konularda dikkat edin. –

+1

"NSData" nesnesinin kaynağı bu yöntem için önemli midir? Ben bir URL'den bir 'NSData' nesnesine indirilen bir .sqlite veritabanını saklıyorum (http://stackoverflow.com/questions/16150196/updating-sqlite-database-without-xml) [Bu soruda], ancak doğru kaydetmiyor gibi görünüyor. Dosya yazılı, ama ben (benim uygulaması aracılığıyla veya 3. taraf görüntüleyici ile ya) erişmeye çalıştığınızda bunun geçerli bir SQLite veritabanı değil söylüyor edilir. WriteToURL: atomically: 'sadece NSString'leri veya bunun gibi bir şeyi kaydetmek için çalışıyor mu? – GeneralMike

+1

'NSData', her tür ikili veri için bir sarıcıdır. Orijinal kaynak önemli olmamalı. Sorunuzun bakınca initWithContentsOfURL 'üzerinde' NSURLConnection' (veya AFNetworking' 'gibi bir kütüphane) kullanarak öneriyoruz:'. Küçük dosyalar için, 'NSData' iyi olabilir, ancak indirme işlemi üzerinde herhangi bir kontrol sağlamaz. Bir şeyler ters gittiğinde, bu sorunu teşhis etmeyi zorlaştırır. NSURL için – Alex

30

writeToURL:atomically: veya writeToFile:atomically: bunun yerine bir URL bir dosya adı varsa. bir dosyaya NSData yazma

+2

+1. NSURL bir dosyaya işaret ettiğinizde NSString pwns. Apple, her zaman NSString yerine dosya yolları için NSURL önerir. :) –

+9

writeToURL ile writeToFile arasında bir fark olduğunu sanmıyorum. Belgelere göre: "Şu anda sadece dosya: // URL'ler desteklendiği için, bu yöntem ile writeToFile arasında atomik olarak hiçbir fark yoktur :, ilk argüman türü hariç" –

+0

"NSData" nesnesinin kaynağı önemli mi? bu yöntem için? [Bu soruda] (http://stackoverflow.com/questions/16150196/updating-sqlite-database-without-xml) Bir URL'den 'NSData' nesnesine indirdiğim .sqlite veritabanını kaydediyorum ama doğru kaydetmiyor gibi görünüyor. Dosya yazılmıştır, ancak erişmeye çalıştığımda (uygulamamda veya bir 3. taraf görüntüleyici ile), geçerli bir SQLite veritabanı olmadığını söyler. WriteToURL: atomically: 'sadece NSString'leri veya bunun gibi bir şeyi kaydetmek için çalışıyor mu? – GeneralMike

28

Bildirimi ana iş parçacığı engelleyebilir IO işlemdir. Özellikle veri nesnesi büyükse.

// 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

nasıl alınır? –

+0

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

0

Ayrıca writeToFile:options:error: veya writeToURL:options:error: durumda tasarruf içinde hata kodları rapor hangi vardır: şöyle

nedenle bir arka plan iş parçacığı üzerinde bu gerçekleştirmek için tavsiye edilir, en kolay yolu GCD'yı kullanmak olacaktır NSData herhangi bir nedenden dolayı başarısız oldu. Örneğin:

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; 
}