2010-07-10 10 views
13

मेरे पास यह उपभोक्ता वर्ग है जो एनएसआईएनपुटस्ट्रीम को तर्क के रूप में लेता है जिसे एसिंक संसाधित किया जाएगा, और मैं उत्पादक वर्ग से आने वाले डेटा को धक्का देना चाहता हूं जिसके लिए इसके एनएसओयूटपुटस्ट्रीम को आउटपुट स्रोत के रूप में प्रदान किया गया है। अब मैं एक बफरिंग (या पारदर्शी) स्ट्रीम कैसे स्थापित कर सकता हूं जो निर्माता के लिए आउटपुट स्ट्रीम के रूप में कार्य करता है, और साथ ही साथ मेरे उपभोक्ता वर्ग के लिए एनएसआईएनपुटस्ट्रीम के रूप में कार्य करता है?एनएसआईटपुटस्ट्रीम के रूप में उपयोग किए जाने वाले एनएसओयूटपुटस्ट्रीम को भड़काना?

मैंने NSOutputStream + outputStreamToMemory और + outputStreamToBuffer पर थोड़ा सा देखा है: क्षमता: लेकिन वास्तव में यह नहीं पता है कि इसे NSInputSource के इनपुट के रूप में कैसे उपयोग किया जाए।

मुझे एक मध्य-वर्ग वर्ग स्थापित करने का कुछ विचार था जो वास्तविक बफर रखता है, फिर दो उप-वर्ग (प्रत्येक एनएसआईएनपुट/आउटपुटस्ट्रीम के लिए एक) बनाता है जिसमें इस बफरिंग क्लास का संदर्भ होता है, और इन उप-वर्गों में अधिकांश कॉल प्रतिनिधि होते हैं उस वर्ग के लिए, उदाहरण के लिए आउटपुट सबक्लास विधियों में स्पेस उपलब्ध है, लिखें: अधिकतम लम्बाई :, और इनपुट के लिए, बाइट्स उपलब्ध है, पढ़ें: अधिकतम लम्बाई: आदि

इस स्थिति तक पहुंचने के तरीके पर कोई सुझाव की सराहना की जाती है। धन्यवाद।

+0

यह है एक बड़ा सवाल है, मैं यह करने के लिए भी एक जवाब खोजने के लिए संघर्ष कर रहा हूँ है! जो मैं अभी तक आया हूं वह एक फ़ाइल को मध्य व्यक्ति के रूप में उपयोग करता है (जो बहुत प्रभावी प्रतीत नहीं होता है)। आशा है कि किसी को बेहतर समाधान मिलेगा – Nick

+0

मुझे एप्पल देव मंचों में कुछ सुझाव मिले जो मुझे सीएफस्ट्रीमक्रेट बाउंडपेयर की ओर इशारा करते थे। SimpleURLConnections नमूना प्रोजेक्ट में इसके लिए कुछ उदाहरण कोड है। आप https://devforums.apple.com/message/258868#258868 भी देख सकते हैं। हालांकि मैंने इसके बाद और अधिक नहीं देखा है। – cahlbin

उत्तर

10

इसे पूरा करने का एक तरीका सेब डेवलपर साइट पर उदाहरण कोड का उपयोग करना होगा। SimpleURLConnection example

यह कैसे करना है, के रूप में PostController.m कोड

@interface NSStream (BoundPairAdditions) 
+ (void)createBoundInputStream:(NSInputStream **)inputStreamPtr outputStream:(NSOutputStream **)outputStreamPtr bufferSize:(NSUInteger)bufferSize; 
@end 

@implementation NSStream (BoundPairAdditions) 

+ (void)createBoundInputStream:(NSInputStream **)inputStreamPtr outputStream:(NSOutputStream **)outputStreamPtr bufferSize:(NSUInteger)bufferSize 
{ 
    CFReadStreamRef  readStream; 
    CFWriteStreamRef writeStream; 

    assert((inputStreamPtr != NULL) || (outputStreamPtr != NULL)); 

    readStream = NULL; 
    writeStream = NULL; 

    CFStreamCreateBoundPair(
     NULL, 
     ((inputStreamPtr != nil) ? &readStream : NULL), 
     ((outputStreamPtr != nil) ? &writeStream : NULL), 
     (CFIndex) bufferSize); 

    if (inputStreamPtr != NULL) { 
     *inputStreamPtr = [NSMakeCollectable(readStream) autorelease]; 
    } 
    if (outputStreamPtr != NULL) { 
     *outputStreamPtr = [NSMakeCollectable(writeStream) autorelease]; 
    } 
} 
@end 

मूल रूप से आप एक बफर के साथ एक साथ दो धाराओं के सिरों देते में देखा जा सकता है।

+0

डेटा के लिए हैंडलएन्ट विधि विधि प्राप्त होती है जब विधि लागू की जाती है (उसी विधि स्टैक में) या फिर यह किसी अन्य ईवेंट में ट्रिगर हो जाएगी? –

+0

क्या आपका मतलब है कि हैंडलएवेंट विधि उसी कॉल स्टैक में होगी जो createBoundInputStream के रूप में है? आईआईआरसी, नहीं। – JugsteR

+0

नहीं, मेरा मतलब था कि इनपुटस्ट्रीम के लिए हैंडलएवेंट विधि उसी कॉल स्टैक पर होगी जो आउटपुटस्ट्रीम पर लिखने वाली विधि के रूप में है? या इसे नए कार्यक्रम के रूप में निर्धारित किया जाएगा? –

1

आप एनएसआईएनपुटस्ट्रीम को उपclassing पर विचार करना चाहते हैं, और अपनी नई कक्षा में स्रोत स्ट्रीम को लपेटना चाहते हैं जो बाइट्स को बफर करता है और/या बाइट्स को संशोधित करता है।

बाउंड सॉकेट दृष्टिकोण पर ऐसा करने के लिए मुझे मुख्य कारण यह जानने का समर्थन करना है। फ़ाइल आधारित NSInputStreams फ़ाइल के भीतर खोजने के लिए एक स्ट्रीम प्रॉपर्टी का उपयोग करते हैं, और मैं इसे सबक्लासिंग के बिना आसानी से व्यवस्थित नहीं कर सका।

इस दृष्टिकोण के साथ एक समस्या यह है कि ऐसा लगता है

टोल फ्री ब्रिजिंग आप उपवर्ग के लिए काम नहीं करेगा है - लेकिन वहाँ एक बहुत अच्छा लेख है, जो आपको एक टेम्पलेट उपवर्ग से अगर आप एक की जरूरत है शुरू करने के लिए दे देंगे:

http://bjhomer.blogspot.co.uk/2011/04/subclassing-nsinputstream.html

मैं एक बफरिंग समाधान का उपयोग कर काम कर मिल गया दोनों दृष्टिकोण - हालांकि एक और मुद्दा मैं उपवर्ग दृष्टिकोण के साथ किया था कि आप सही ढंग श्रोताओं के लिए घटनाओं को भेजने के लिए देखभाल करने के लिए की जरूरत है - उदाहरण के लिए, अपने स्रोत धारा आप एक भेजता है ईओएफ कार्यक्रम, जब तक आप बफर खाली नहीं कर लेते हैं, तब तक आप इसे अपने उपभोक्ता तक नहीं पारित करेंगे - इसलिए वहां कुछ करने के बारे में कुछ गड़बड़ है।

इसके अलावा - आपको यह सुनिश्चित करने की आवश्यकता हो सकती है कि क्लाइंट मुख्य रन लूप (मुझे यह ग्रैंड सेंट्रल प्रेषण के साथ काम कर रहा है) से पढ़ना पड़ेगा - क्योंकि स्रोत स्ट्रीम पर आप अपने सबक्लास में जो भी देखते हैं - के साथ संघर्ष करेंगे उपभोक्ता अन्यथा। यद्यपि आप धाराओं का निरीक्षण करने के लिए किसी भी रन लूप को चुनने में सक्षम होने लगते हैं, केवल मुख्य कार्य करता है।

तो कुल मिलाकर मैं कहूंगा कि जब तक आपको मांग का समर्थन करने की आवश्यकता नहीं है - या विशेष रूप से जोड़े गए स्ट्रीम विधि के विपरीत हैं।

0

यहाँ एक पहले से ही लागू किया वर्ग कि वास्तव में करता है कि आप क्या चाहते

BufferOutputStreamToInputStream

// initialize 
self.bufferWriter = [[BufferOutputStreamToInputStream alloc] init]; 
[self.bufferWriter openOutputStream]; 

// later you want to set the delegate of the inputStream and shedule it in runloop 
// remember, you are responsible for the inputStream, the outputStream is taken care off;) 
self.bufferWriter.inputStream.delegate = self; 
[self.bufferWriter.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[self.bufferWriter.inputStream open] 

// fill with data when desired on some event  
[self.bufferWriter addDataToBuffer:someData]; 
संबंधित मुद्दे

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