2009-08-31 3 views
13

मैं HTTP कनेक्शन प्रबंधित करने के लिए एक NSOperationQueue का उपयोग कर रहा हूं (ASI-HTTPRequest का उपयोग कर)। चूंकि मेरे पास एकाधिक विचार हैं और HTTP कनेक्शन का अनुरोध करने के लिए इन अलग-अलग विचारों की आवश्यकता है, क्या मुझे ऐप प्रतिनिधि में वैश्विक NSOperationQueue बनाने का प्रयास करना चाहिए, या क्या मुझे प्रत्येक विचार में से एक होना चाहिए? मैं NSOperationQueue से परिचित नहीं हूँ।व्यू कंट्रोलर में NSOperationQueue साझा करना?

मैं जानना चाहता हूं कि) सबसे अच्छा अभ्यास क्या है और बी) यदि कोई सर्वोत्तम अभ्यास नहीं है, तो ट्रेडऑफ क्या हैं।

मैंने कक्षा में ऑपरेशन कतार डालने का प्रयास किया (एक संपत्ति के रूप में) जहां मैं सर्वर कनेक्शन को संभालता हूं लेकिन कार्य कभी नहीं निकाल दिया जाता है। इसे समझ नहीं सका लेकिन [कतार संचालन] = 0. अगर कोई इसका समाधान जानता है, तो मुझे लगता है कि यह रखने के लिए यह सबसे अच्छा स्थान होगा।

उत्तर

14

मैंने NSOperationQueue पर एक क्लास विधि जोड़कर इसे हल किया है जो मुझे लगता है कि ऐप्पल चूक गया है; एक साझा ऑपरेशन कतार। मैं NSOperationQueue पर एक वर्ग के रूप में के रूप में जोड़ना:

// NSOperationQueue+SharedQueue.h 
@interface NSOperationQueue (SharedQueue) 
+(NSOperationQueue*)sharedOperationQueue; 
@end 

// NSOperationQueue+SharedQueue.m 
@implementation NSOperationQueue (SharedQueue) 
+(NSOperationQueue*)sharedOperationQueue; 
{ 
    static NSOperationQueue* sharedQueue = nil; 
    if (sharedQueue == nil) { 
    sharedQueue = [[NSOperationQueue alloc] init]; 
    } 
    return sharedQueue; 
} 
@end 

इस तरह से मैं कतारों की एक पूरी गुच्छा प्रबंधन करने के लिए जब तक मैं वास्तव में करने की जरूरत है की जरूरत नहीं है। मेरे पास मेरे सभी व्यू कंट्रोलर से साझा कतार में आसान पहुंच है।

मैं NSObject के लिए एक वर्ग यह और भी आसान इस साझा कतार पर नए संचालन जोड़ने के लिए बनाने के लिए भी जोड़ लिया है:

// NSObject+SharedQueue.h 
@interface NSObject (SharedQueue) 
-(void)performSelectorOnBackgroundQueue:(SEL)aSelector withObject:(id)anObject; 
@end 

// NSObject+SharedQueue.m 
@implementation NSObject (SharedQueue) 
-(void)performSelectorOnBackgroundQueue:(SEL)aSelector withObject:(id)anObject; 
{ 
    NSOperation* operation = [[NSInvocationOperation alloc] initWithTarget:self 
                   selector:aSelector 
                    object:anObject]; 
    [[NSOperationQueue sharedOperationQueue] addOperation:operation]; 
    [operation release]; 
} 
@end 
+1

इस कतार को फिर से कैसे हटाया जाता है? – fabb

0

यदि आपके पास पहले से ही एक क्लाइंट के लिए पॉइंटर है जो प्रत्येक व्यू/व्यू कंट्रोलर में कनेक्शन को संभालता है, तो कोई कारण नहीं है कि आपको ऑपरेशन कतार में पॉइंटर भी होना चाहिए।

मुझे लगता है कि आप जो करना चाहते हैं वह कुछ है: ए) सर्वर हैंडलिंग ऑब्जेक्ट के लिए देखें (नियंत्रक) हाथ url (+ डेटा), बी) सर्वर हैंडलिंग ऑब्जेक्ट्स ऑपरेशन बनाता है और इसे एक कतार में रखता है कि यह और केवल के लिए एक सूचक है।

यह पता लगाना मुश्किल है कि यदि आप अधिक जानकारी प्रदान नहीं करते हैं तो यह क्यों काम नहीं करता है।

मैं अत्यधिक taking a look at ASIHTTPRequest की सिफारिश करता हूं जो इस प्रकार के कार्य को संभालने के लिए नेटवर्कक्यूयू क्लास प्रदान करता है। इसमें कई सुविधाजनक प्रतिनिधि फ़ील्ड हैं जो आपको प्रगति का ट्रैक रखने के लिए पंजीकरण करते हैं, जानते हैं कि डाउनलोड कब या अपलोड समाप्त होता है आदि।

3

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

+0

मैं वही काम करता हूं 1) मैं सिंगलटन का उपयोग नहीं करता, मैं एक डेटा नियंत्रक का उपयोग करता हूं जो ऐप प्रतिनिधि से लटकता है और 2) मैं प्रतिनिधिमंडल के बजाय अधिसूचनाओं का उपयोग करता हूं। एकाधिक दृश्य नियंत्रकों और अनुरोध/संचालन के साथ, प्रतिनिधिमंडल तर्क बहुत बालों वाली हो सकती है। – kubi