2011-02-03 22 views
6

मेरी मॉडल कक्षा को इंटरनेट से कुछ डेटा प्राप्त करना है। तो मैंने इसे एक और थ्रेड पर चलाने का फैसला किया ताकि यूई फ्रीज न हो। एक वस्तु कुछ डेटा यह पहला मॉडल इस प्रकार का एक पद्धति का उपयोग करके पूछता चाहता है तो जब:किसी अन्य धागे से मुख्य धागे पर रन विधि

- (void)giveMeSomeData:(id)object withLabel:(id)label { 
objectAsking= object; 
theLabel= label; 
NSThread* thread= [[NSThread alloc] initWithTarget:self selector:@selector(getTheDataFromInternet) object:nil]; 
[thread start]; 
} 

- (void)getTheDataFromInternet { 
//getting data... 

theData= [dataFromInternet retain]; //this is the data the object asked for 
[self returnObjectToAsker]; 
} 

- (void)returnObjectToAsker { 
[objectAsking receiveData:theData withLabel:theLabel]; 
} 

मैं अभी भी एक नौसिखिया हूँ के रूप में, क्या आप मुझे बता सकते हैं अगर यह एक अच्छा पैटर्न है?

धन्यवाद!

+1

मेमोरी प्रबंधन नियमों के अनुसार, जो भी आप बनाते हैं उसे छोड़ना न भूलें। http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html आपके द्वारा दिखाए गए कोड से, आपको स्वामित्व होना चाहिए और यदि जीसी के तहत नहीं चल रहा है, तो अंत में दोनों 'थ्रेड' और ' theData'। –

+1

इसके अलावा, ऐसा लगता है कि 'getTheDataFromInternet' इतनी समकालिक रूप से करता है। ऐसा न करें- आप डेटा प्राप्त करने के लिए कई मिलीसेकंड/सेकंड/मिनट/घंटे/दिन के लिए अपने यूआई को अवरुद्ध कर देंगे। इससे कोई फर्क नहीं पड़ता कि यह कितना छोटा है, या आपका खुद का इंटरनेट कनेक्शन कितना भयानक है-डेटा के इंतजार के दौरान आपके उपयोगकर्ता आपके ऐप को लॉक कर देंगे। इसके बजाय, एसिंक्रोनस प्राप्त करने के लिए एक NSURLConnection बनाएं (और स्वयं) बनाएं: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/ एक कम से कम एक NSProgressIndicator का उपयोग करके प्रगति की रिपोर्ट करें। –

+0

बेशक, मैंने स्पष्टता के लिए इन पंक्तियों को नहीं लिखने का फैसला किया;) –

उत्तर

12

आपका सेटअप काफी सही है। आप मुख्य धागे पर किसी भी तरह का नेटवर्क कनेक्शन शुरू नहीं करना चाहते हैं।

वर्तमान में यह खड़ा है, -returnObjectToAsker पृष्ठभूमि धागे पर निष्पादित किया जाएगा।

आपको शायद -[NSObject performSelectorOnMainThread:withObject:waitUntilDone:] में रुचि होगी।

या यदि आप ग्रांड सेंट्रल डिस्पैच (iOS 4+, मैक ओएस एक्स 10.6+) के साथ कुछ करना चाहता था, तुम कर सकते हो:

#import <dispatch/dispatch.h> 

- (void)giveMeSomeData:(id)object withLabel:(id)label { 
    dispatch_async(dispatch_get_global_queue(0,0), ^{ 
     //this runs on a background thread 
     //get data from the internet 
     dataFromTheInternet = ...; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     [object receiveData:dataFromTheInternet withLabel:label]; 
     //this runs on the main thread. Use theData 
     }); 
    }); 
} 

के बाद से ब्लॉक अपने वातावरण पर कब्जा, तुम भी नहीं होगा object और label को इवर में सहेजने के लिए। :)

+0

आपके त्वरित उत्तर के लिए धन्यवाद :) आप जीसीडी या एनएसटीएचड का उपयोग करते हुए क्या पसंद करते हैं? –

+1

@Forchita अगर मैं केवल आईओएस 4 या ओएस 10.6 का समर्थन कर सकता हूं, तो मैं जीसीडी का उपयोग करना पसंद करता हूं क्योंकि मैं सभी तर्क एक ही विधि में रख सकता हूं। –

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