أسهل طريقة لكتابة NSData إلى ملف
سؤال
NSData *data;
data = [self fillInSomeStrangeBytes];
وسؤالي هو الآن كيف أستطيع أن أكتب هذا data
على أسهل طريقة لملف.
و(لقد بالفعل file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes
NSURL)
المحلول
وNSData
لديه طريقة تسمى writeToURL:atomically:
التي لا بالضبط ما تريد القيام به. ابحث في وثائق NSData
لمعرفة كيفية استخدامها.
نصائح أخرى
لاحظ أن الكتابة NSData
في ملف هي عملية IO التي قد منع الترابط الرئيسي. خصوصا إذا كان الكائن البيانات كبيرة.
لذلك ينصح لتنفيذ هذا على خلفية موضوع، فإن أسهل طريقة هي استخدام GCD كما يلي:
// 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];
});
<وأ href = "http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html#//apple_ref/doc/uid/20000172-CIACAEJE" يختلط = "noreferrer"> writeToURL: بالذرة: أو <وأ href = "http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html#//apple_ref/ وثيقة / رمز المستخدم / 20000172-CIAEAHFJ "يختلط =" noreferrer "> writeToFile: بالذرة: إذا كان لديك اسم ملف بدلا من URL
لديك أيضا writeToFile:options:error:
أو <ل أ href = "https://developer.apple.com/documentation/foundation/nsdata/1410595-writetourl؟language=objc" يختلط = "نوفولو noreferrer"> writeToURL:options:error:
حيث يمكن الإبلاغ عن رموز الخطأ في حالة إنقاذ ل فشل 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;
}