2012-05-04 18 views
5

मैं बस तेजी से पहुंच के लिए अलग-अलग छवियों को प्रस्तुत करना चाहता हूं। मैं विभिन्न ब्लॉक निष्पादित करने के लिए यहां भव्य केंद्रीय प्रेषण का उपयोग करता हूं।ग्रैंड सेंट्रल डिस्पैच - लोड होने पर पहली छवि प्रदर्शित करें?

कतार शुरू करने के बाद, मैं इसे पूरा होने पर पहली छवि सेट करना चाहता हूं। नीचे दिए गए वर्तमान कोड के साथ, दुर्भाग्य से पहली छवि केवल तब प्रदर्शित की जाएगी जब सभी छवियां प्रस्तुत की गई हों।

तो मैं कोड को कैसे संशोधित कर सकता हूं? क्या प्रत्येक छवि समाप्त होने पर प्रतिनिधि बनना संभव है?

Here's कोड:

// Async prerendering 
    for (int i = 0; i < count; i++) { 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 

      dispatch_async(dispatch_get_main_queue(), ^{ 

       UIImage* finalImage = [self prerenderImageForIndex:i]; 
       [self.imageArray addObject:finalImage]; 

       // TODO: i want to display the first image. 
       // rendering goes on in the background 

       if (i==0 && [self.imageArray objectAtIndex:0] != nil) { 
        self.image = [self.imageArray objectAtIndex:0]; 
       } 
      }); 
     }); 
    } 

अद्यतन:

-(UIImage*) prerenderImageForIndex:(int)frame { 
UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.frame.size.width, self.frame.size.height), NO, 0);  

     for (int i=0; i< [configurationArray count]; i++) {  
     //... get the layerName 

     UIImage* layerImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:layerName ofType:@"png"]]; 

       // draw layer with blendmode and alpha 
     [layerImage drawInRect:CGRectMake(x, y, layerImage.size.width, layerImage.size.height) 
        blendMode:layerblendmode 
         alpha: layeralpha]; 

      } 

    // Get current context as an UIImage 
    UIImage* finalImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

return finalImage; 

} 

मैं सिर्फ जानना चाहता मैं कैसे रद्द/स्टॉप या किसी चल कतार पुनः आरंभ करना चाहते हैं? क्या यह संभव है? आपकी मदद के लिए धन्यवाद।

उत्तर

2

आप एक सीरियल कतार है, जो उदाहरण के लिए फीफो कार्यान्वित उपयोग करने के लिए:

dispatch_queue_t queue; 
queue = dispatch_queue_create("myImageQueue", NULL); 
for(int i = 0; i<count; i++) { 
    dispatch_async(queue, ^{ 
     // do your stuff in the right order 
    }); 
} 
धारावाहिक डिस्पैच कतारों के लिए

को देखो: http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

+0

हाँ, यह समस्या हल करता है! आपका बहुत बहुत धन्यवाद। मैं "self.image" को "dispatch_async (queue,^{" के भीतर असाइन करता हूं। अब यह सही काम करता है! फिर भी मैं इसके बारे में प्रलेखन पर एक नज़र डालेगा। धन्यवाद। – geforce

2

मुझे यकीन नहीं है कि आपके पास dispatch_async इस तरह घोंसला क्यों है लेकिन शायद यह समस्या है। मैं कल्पना करूंगा कि नीचे की तरह कुछ जो आप चाहते हैं उसे पूरा करेगा। जब आप वास्तव में यूआई अपडेट करना चाहते हैं तो आपको केवल मुख्य कतार प्राप्त करने की आवश्यकता है, बाकी सब कुछ पृष्ठभूमि कतार पर किया जाना चाहिए।

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 

    UIImage* finalImage = [self prerenderImageForIndex:i]; 
    [self.imageArray addObject:finalImage]; 

    if (i==0 && [self.imageArray objectAtIndex:0] != nil) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.image = [self.imageArray objectAtIndex:0]; 
     }); 
    } 
}); 
+0

धन्यवाद स्टीव, लेकिन वह पहले से ही परीक्षण किया मैंने । जब मैं ऐसा करता हूं, तो मेरी सभी छवियों को यादृच्छिक रूप से प्रस्तुत किया जाएगा :) लेकिन मुझे सिर्फ सही इंडेक्स ऑर्डर में छवियों को एक-एक करके प्रस्तुत करना होगा और पहली छवि प्रदर्शित करना होगा ... कोई अन्य विचार? – geforce

+0

हम्म, तो अब मैं थोड़ा उलझन में हूं। मैंने सोचा कि आप केवल पहली छवि दिखाना चाहते हैं और अन्य सभी छवियों को पृष्ठभूमि में लोड करना चाहते हैं। मैं मान रहा था कि आपकी [स्वयं प्रीरेंडर इमेजफोर इंडेक्स: i] विधि एक छवि प्राप्त करने के लिए कुछ नेटवर्क कॉल कर रही थी। शायद आप पूरी तस्वीर की बेहतर समझ देने के लिए उस विधि को पोस्ट कर सकते हैं। – SteveB

+0

धन्यवाद स्टीव, मैंने अभी "prerenderImageForIndex" विधि को जोड़ा है। उम्मीद है कि मदद करता है ... – geforce

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

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