2011-11-07 33 views
7

Tôi có tệp video có dung lượng khoảng 2GB. Tiêu đề của tệp video này được mã hóa (khoảng 528 byte được mã hóa). Để giải mã tệp video này, tôi đang đọc tất cả các byte từ tệp vào đối tượng NSData. Ngay sau khi tôi viết tập tin này vào đối tượng NSData, ứng dụng của tôi bị treo (có thể là b'coz max-256MB RAM cho iPad).Viết một lượng lớn dữ liệu vào các đối tượng NSData-iOS

Vậy làm thế nào để tôi lưu trữ đối tượng NSData này vào bộ nhớ ảo của iPad/iPhone tạm thời?

Bất kỳ phương pháp tiếp cận nào khác bằng phương tiện mà tôi có thể đạt được như cũ?

Trả lời

11

Sử dụng NSInputStream để đọc từng phần từng tệp để bạn không tải tất cả vào bộ nhớ cùng một lúc. Cụ thể, bạn sẽ muốn sử dụng số hasBytesAvailableread:maxLength:.

Cái gì như:

NSInputStream *myStream = [NSInputStream inputStreamWithFilAtPath:pathToAbsurdlyLargeFile]; 
[myStream open]; 
Byte buffer[BUFFER_SIZE]; 
while ([myStream hasBytesAvailable]) 
{ 
    int bytesRead = [myStream read:buffer maxLength:BUFFER_SIZE]; 
    NSData *myData = [NSData dataWithBytes:buffer length:bytesRead]; 
    // do other stuff... 
} 
[myStream close]; 

Lưu ý rằng bạn có thể không cần phải tạo ra một đối tượng NSData. Bạn vừa đề cập đến bạn đang sử dụng nó, vì vậy tôi đã ném nó vào.

+0

[mystream hasBytesAvailable] luôn đưa ra giá trị NO Bool. –

+0

Kích thước của tệp là khoảng 300MB, đường dẫn đến tệp đã cho cũng đúng. –

+0

Đã thêm dòng '[myStream open];' vào câu trả lời của tôi. Điều này là rất quan trọng cho việc này để hoạt động đúng. Bạn cũng sẽ cần phải gọi '[myStream close];' khi bạn hoàn thành luồng. – Sam

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