मैंने यूजर के साथ खेलने के बावजूद डेटा लाने के लिए कई थ्रेडों में एसिंक्रोनस कनेक्शन को लागू करने के लिए थ्री 20 लाइब्रेरी को बढ़ाया। सीएफनेटवर्क ढांचे के भीतर पाए गए यादृच्छिक मेमोरी लीक का पीछा करने के कई घंटों बाद मैंने अंततः इस मुद्दे को रूट किया। मैं कभी-कभी प्रतिक्रियाओं और डेटा का ट्रैक खो रहा था।
एकाधिक थ्रेड द्वारा उपयोग की जाने वाली किसी भी डेटा संरचना को उचित लॉक द्वारा संरक्षित किया जाना चाहिए। यदि आप पारस्परिक रूप से अनन्य तरीके से साझा डेटा संरचनाओं तक पहुंचने के लिए ताले का उपयोग नहीं कर रहे हैं तो आप थ्रेड सुरक्षित नहीं हैं। ऐप्पल के Threading Programming Guide के "Using Locks" अनुभाग देखें।
सबसे अच्छा समाधान NSURLConnection को उपclass करना है और इसके संबंधित प्रतिक्रिया और प्रतिक्रिया डेटा को संग्रहीत करने के लिए इंस्टेंस चर जोड़ें।प्रत्येक कनेक्शन प्रतिनिधि विधि में आप NSRLConnection को अपने उप-वर्ग में डालें और उन आवृत्ति चरों तक पहुंचें। यह पारस्परिक रूप से अनन्य होने की गारंटी है क्योंकि प्रत्येक कनेक्शन को अपनी प्रतिक्रिया और डेटा के साथ बंडल किया जाएगा। मैं अत्यधिक कोशिश कर रहा हूं क्योंकि यह सबसे साफ समाधान है। मेरे कार्यान्वयन से कोड यहां दिया गया है:
@interface TTURLConnection : NSURLConnection {
NSHTTPURLResponse* _response;
NSMutableData* _responseData;
}
@property(nonatomic,retain) NSHTTPURLResponse* response;
@property(nonatomic,retain) NSMutableData* responseData;
@end
@implementation TTURLConnection
@synthesize response = _response, responseData = _responseData;
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate {
NSAssert(self != nil, @"self is nil!");
// Initialize the ivars before initializing with the request
// because the connection is asynchronous and may start
// calling the delegates before we even return from this
// function.
self.response = nil;
self.responseData = nil;
self = [super initWithRequest:request delegate:delegate];
return self;
}
- (void)dealloc {
[self.response release];
[self.responseData release];
[super dealloc];
}
@end
/////////////////////////////////////////////////////////////////
////// NSURLConnectionDelegate
- (void)connection:(NSURLConnection*)connection
didReceiveResponse:(NSHTTPURLResponse*)response {
TTURLConnection* ttConnection = (TTURLConnection*)connection;
ttConnection.response = response;
ttConnection.responseData = [NSMutableData
dataWithCapacity:contentLength];
}
- (void)connection:(NSURLConnection*)connection
didReceiveData:(NSData*)data {
TTURLConnection* ttConnection = (TTURLConnection*)connection;
[ttConnection.responseData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
TTURLConnection* ttConnection = (TTURLConnection*)connection;
if (ttConnection.response.statusCode == 200) {
// Connection success
}
}
- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error {
TTURLConnection* ttConnection = (TTURLConnection*)connection;
// Handle the error
}
स्रोत
2009-12-21 05:39:11
आपके सुझाव के लिए धन्यवाद, मेरा मानना है कि यह इसे संभालने का सबसे प्रभावी तरीका है। मुझे आश्चर्य है कि इतने सालों के बाद, ऐप्पल ने अभी भी एनएसआरयूटीएबलडेटा * को NSURLConnection में नहीं छोड़ा है। मुझे कोई कारण नहीं दिख रहा है कि उन्हें क्यों नहीं करना चाहिए। यह एक मानक ऑपरेशन है आप नहीं कहेंगे? – taylorcressy