Lưu ý rằng việc viết NSData
vào tệp là thao tác IO có thể chặn chuỗi chính. Đặc biệt nếu đối tượng dữ liệu lớn.
Vì vậy nó được khuyên nên thực hiện điều này trên một sợi nền, cách dễ nhất là nên sử dụng GCD như sau:
// 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];
});
Nguồn
2014-05-26 06:09:25
Xem ra các vấn đề cuối cùng. –
Nguồn của đối tượng 'NSData' có quan trọng đối với phương pháp này không? [Trong câu hỏi này] (http://stackoverflow.com/questions/16150196/updating-sqlite-database-without-xml) Tôi đang lưu một cơ sở dữ liệu .sqlite mà tôi đã tải về vào một đối tượng 'NSData' từ một URL, nhưng nó dường như không tiết kiệm chính xác. Các tập tin được viết, nhưng khi tôi cố gắng truy cập nó (hoặc thông qua ứng dụng của tôi hoặc với một người xem bên thứ 3) nó nói với tôi nó không phải là một cơ sở dữ liệu SQLite hợp lệ. Liệu 'writeToURL: nguyên tử:' chỉ làm việc để lưu 'NSString' hoặc một cái gì đó như thế? – GeneralMike
'NSData' là trình bao bọc cho bất kỳ loại dữ liệu nhị phân nào. Nguồn gốc không quan trọng. Nhìn vào câu hỏi của bạn, tôi khuyên bạn nên sử dụng 'NSURLConnection' (hoặc một thư viện như' AFNetworking') trên 'initWithContentsOfURL:'. Đối với các bản tải xuống nhỏ, 'NSData' có thể tốt nhưng không cung cấp bất kỳ quyền kiểm soát nào đối với việc tải xuống. Khi xảy ra sự cố, điều này làm cho việc chẩn đoán sự cố trở nên khó khăn. – Alex