2011-11-07 12 views
7

मेरे पास 2 जीबी आकार में एक वीडियो फ़ाइल है। वीडियो फ़ाइल का यह हेडर एन्क्रिप्ट किया गया है (लगभग 528 बाइट एन्क्रिप्टेड)। इस वीडियो फ़ाइल को डिक्रिप्ट करने के लिए मैं फ़ाइल से सभी बाइट्स को NSData ऑब्जेक्ट में पढ़ रहा हूं। जैसे ही मैं इस फ़ाइल को NSData ऑब्जेक्ट में लिखता हूं, मेरा एप्लिकेशन क्रैश हो जाता है (संभवतः आईपैड के लिए अधिकतम बोकोज़ अधिकतम -256 एमबी रैम)।एनएसडीटा ऑब्जेक्ट्स के डेटा के विशाल भाग लिखना-आईओएस

तो मैं इस एनएसडीएटी ऑब्जेक्ट को अस्थायी रूप से आईपैड/आईफोन की वर्चुअल मेमोरी में संग्रहीत करने के बारे में कैसे जा सकता हूं?

कोई अन्य दृष्टिकोण जिसके माध्यम से मैं इसे प्राप्त कर सकता हूं?

उत्तर

11

टुकड़ा द्वारा फ़ाइल टुकड़े में पढ़ने के लिए NSInputStream का उपयोग करें ताकि आप इसे सभी को एक ही बार में स्मृति में लोड नहीं कर रहे हैं। विशेष रूप से आप hasBytesAvailable और read:maxLength: का उपयोग करना चाहेंगे।

कुछ की तरह:

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]; 

ध्यान दें कि आप एक NSData वस्तु बनाने के लिए की जरूरत नहीं हो सकती है। आपने अभी उल्लेख किया है कि आप इसका उपयोग कर रहे थे, इसलिए मैंने इसे फेंक दिया।

+0

[mystream hasBytesAvailable] हमेशा कोई बूल मान नहीं दे रहा है। –

+0

फ़ाइल का आकार लगभग 300 एमबी है, दी गई फ़ाइल का पथ भी सही है। –

+0

मेरे उत्तर में '[myStream open]' पंक्ति जोड़ा गया। यह ठीक से काम करने के लिए आलोचनात्मक है। जब आप स्ट्रीम के साथ होते हैं तो आपको '[myStream close] को कॉल करने की भी आवश्यकता होगी। – Sam

संबंधित मुद्दे