2011-09-26 31 views
6

Tôi đoán điều này rất rõ ràng, nhưng tôi có câu hỏi về việc tải dữ liệu. Nếu có một tệp gọi là library.dat lưu trữ tất cả các loại thông tin về các đối tượng trong ứng dụng. Nó được thiết lập tất cả độc đáo (về phương pháp initWithCoder và encodeWithCoder vv), nhưng tôi đã tự hỏi điều gì xảy ra nếu thư viện.dat bị hỏng. Tôi đã làm hỏng nó một chút và sau đó ứng dụng sẽ sụp đổ. Có cách nào để ngăn chặn sự cố không? Tôi có thể kiểm tra tệp trước khi tải tệp không? Dưới đây là bit mà có khả năng có thể rất nghiêm trọng:NSKeyedUnarchiver - cách ngăn chặn sự cố

-(void)loadLibraryDat { 

    NSLog(@"loadLibraryDat..."); 
    NSString *filePath = [[self documentsDirectory] stringByAppendingPathComponent:@"library.dat"]; 

    // if the app crashes here, there is no way for the user to get the app running- except by deleting and re-installing it... 
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; 



} 

tôi đã có một cái nhìn tại * NSInvalidUnarchiveOperationException nhưng không có ý tưởng làm thế nào tôi nên thực hiện điều này trong mã của tôi. Tôi xin cảm ơn vì bất kỳ ví dụ nào. Cảm ơn trước!

Trả lời

13

Cuối cùng, bạn có thể kết thúc cuộc gọi không lưu trữ với @try {} @ catch {} @. Điều này được mô tả trong tài liệu của Apple tại đây: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/ObjectiveC/Chapters/ocExceptionHandling.html

@try { 
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; 
} @catch (NSInvalidUnarchiveOperationException *ex) { 
    //do whatever you need to in case of a crash 
} @finally { 
    //this will always get called even if there is an exception 
} 
+3

Cảm ơn bạn rất nhiều vì đã xác nhận rằng đây là cách chính thức để xử lý việc này. –

+1

NSInvalidUnarchiveOperationException là một chuỗi, không phải là một lớp Ngoại lệ. Vì vậy, tôi nghĩ rằng bạn phải bắt NSException, sau đó kiểm tra chống lại tên của nó ...? –

4

Bạn đã thử các khối 'try/catch' chưa? Một cái gì đó như thế này:

@try { 
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; 
} 
@catch (NSException* exception) { 
    NSLog(@"provide some logs here"); 
    // delete corrupted archive 
    // initialize libraryDat from scratch 
} 
+0

Cảm ơn! Tôi khá mới mẻ với điều này và mọi người luôn cảnh báo về các khối 'try/catch'. Mặc dù vậy, âm thanh rất hợp lý trong trường hợp này. Tôi đoán không có cách nào khác ngoài làm việc với các khối, đúng không? –

+1

Tôi nghĩ rằng không có giải pháp đơn giản nào khác. Không may. – igoris

+0

Chỉ cần thử điều này, nhưng xCode cho tôi biết rằng "Tên kiểu không xác định 'NSInvalidUnarchiveOperationException'" - tôi có phải định nghĩa nó trước đó không? –

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