2010-09-29 42 views
6

Tôi đang cố lưu một mảng ảnh vào thư mục tài liệu. Tôi quản lý để lưu một hình ảnh như NSData và lấy nó bằng cách sử dụng phương pháp dưới đây, nhưng tiết kiệm một mảng có vẻ là vượt ra ngoài tôi. Tôi đã xem xét một số câu hỏi khác có liên quan và có vẻ như tôi đang làm mọi thứ đúng.Viết một mảng NSData vào tập tin

Thêm hình ảnh như NSData và lưu hình ảnh:

[imgsData addObject:UIImageJPEGRepresentation(img, 1.0)]; 
[imgsData writeToFile:dataFilePath atomically:YES]; 

Lấy dữ liệu:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"imgs.dat"]; 
[self setDataFilePath:path]; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 
if([fileManager fileExistsAtPath:dataFilePath]) 
imgsData = [[NSMutableArray alloc] initWithContentsOfFile:dataFilePath]; 

Vì vậy, viết một hình ảnh như NSData sử dụng tác phẩm trên, nhưng không phải là một mảng của hình ảnh như NSData. Nó nằm trong mảng, nhưng nó có 0 đối tượng, không đúng, vì mảng mà tôi đang lưu có nhiều. Có ai có ý tưởng nào?

Trả lời

8

Trước hết, bạn nên chải lên Cocoa Memory Management, dòng đầu tiên của mã là một chút lo lắng.

Để tuần tự hóa dữ liệu, bạn có thể muốn đi với NSPropertyListSerialization. Lớp này tuần tự hóa các mảng, từ điển, chuỗi, ngày, số và đối tượng dữ liệu. Nó có một hệ thống báo cáo lỗi, không giống như phương thức initWithContentsOfFile:. Tên và đối số của phương thức dài một chút để vừa với một dòng, vì vậy đôi khi bạn có thể thấy chúng được viết bằng ký hiệu Eastern Polish Christmas Tree. Để tiết kiệm đối tượng imgsData của bạn, bạn có thể sử dụng:

NSString *errString; 
NSData *serialized = 
    [NSPropertyListSerialization dataFromPropertyList:imgsData 
               format:NSPropertyListBinaryFormat_v1_0 
            errorDescription:&errString]; 

[serialized writeToFile:dataFilePath atomically:YES]; 

if (errString) 
{ 
    NSLog(@"%@" errString); 
    [errString release]; // exception to the rules 
} 

để đọc nó trở lại, sử dụng

NSString *errString; 
NSData *serialized = [NSData dataWithContentsOfFile:dataFilePath]; 

// we provide NULL for format because we really don't care what format it is. 
// or, if you do, provide the address of an NSPropertyListFormat type. 

imgsData = 
    [NSPropertyListSerialization propertyListFromData:serialized 
            mutabilityOption:NSPropertyListMutableContainers 
               format:NULL 
            errorDescription:&errString]; 

if (errString) 
{ 
    NSLog(@"%@" errString); 
    [errString release]; // exception to the rules 
} 

Kiểm tra các nội dung của errString để xác định những gì đã xảy ra. Xin lưu ý rằng hai phương pháp này không được sử dụng cho các phương pháp dataWithPropertyList:format:options:error:propertyListWithData:options:format:error: nhưng chúng đã được thêm vào trong Mac OS X 10.6 (Tôi không chắc liệu chúng có sẵn trên iOS) hay không.

+0

Điểm tốt về quản lý bộ nhớ. +1 – Moshe

+0

Thật tuyệt vời! Cảm ơn, nó hoạt động kỳ diệu! – Beaker

+0

Ngoài ra, trên một mặt lưu ý, dataWithPropertyList: format: options: error: là avaiable trong iOS 4. Vì vậy, không hữu ích cho tôi, nhưng có thể giúp đỡ với bất kỳ lập trình viên iPhone 4. – Beaker

Các vấn đề liên quan