मेरे पास एक छवि लोडर वर्ग है जो वेब से NSURL लोड और छवि प्रदान करता है और पूर्णता ब्लॉक निष्पादित करता है। कोड वास्तव में काफी सरलजीसीडी और बहुत सारे धागे के साथ समस्या
- (void)downloadImageWithURL:(NSString *)URLString completion:(BELoadImageCompletionBlock)completion
{
dispatch_async(_queue, ^{
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIImage *image = nil;
NSURL *URL = [NSURL URLWithString:URLString];
if (URL) {
image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
}
dispatch_async(dispatch_get_main_queue(), ^{
completion(image, URLString);
});
});
}
जब मैं की जगह
dispatch_async(_queue, ^{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
छवियाँ बाहर टिप्पणी की साथ बहुत तेजी से लोड कर रहे हैं है, जो काफी तार्किक है (कि पहले छवियों को एक समय में लोड किया जाएगा, अब उनमें से एक गुच्छा एक साथ लोड हो रहे हैं)। मेरी समस्या यह है कि मेरे पास शायद 50 छवियां हैं और मैं डाउनलोड करता हूं IMageWithURL: समापन: उन सभी के लिए विधि और जब मैं अपने ऐप के बजाय वैश्विक कतार का उपयोग करता हूं तो अंततः क्रैश हो जाता है और मुझे लगता है कि 85+ धागे हैं। क्या समस्या यह हो सकती है कि मेरी कॉलिंग dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_HIGH, 0) पंक्ति में 50 बार जीसीडी बहुत सारे धागे बना देती है? मैंने सोचा कि जीसीडी सभी चलने को संभालता है और सुनिश्चित करता है कि धागे की संख्या बड़ी नहीं है, लेकिन यदि ऐसा नहीं है तो क्या कोई तरीका है कि मैं धागे की संख्या को प्रभावित कर सकता हूं?
नहीं, इसका कतार प्राथमिकता से कोई लेना-देना नहीं है। जीसीडी केवल अतिरिक्त थ्रेड बनाता है जब कर्नेल में वैश्विक समवर्ती कतार ब्लॉक के लिए मौजूदा थ्रेड पर अवरुद्ध होता है। – das
@ दास धन्यवाद मैंने कुछ संपादन किए हैं लेकिन कृपया मेरा उत्तर भी बेहतर बनाने के लिए स्वतंत्र महसूस करें :) – jackslash