2012-05-04 18 views
5

Sadece hızlı erişim için farklı görüntüleri prerender istiyorum. Farklı blokları yürütmek için büyük merkezi gönderim kullanıyorum.Grand Central Dispatch - yüklendiğinde ilk resmi gösterilsin mi?

Sırayı başlattıktan sonra, ilk resmi bittiğinde ayarlamak istiyorum. Aşağıdaki geçerli kodla, maalesef ilk görüntü tüm görüntüler oluşturulduğunda görüntülenecektir.

Kodları nasıl değiştirebilirim? Her görüntü bittiğinde bir temsilci almak mümkün mü?

Here's kodu:

// 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]; 
       } 
      }); 
     }); 
    } 

Güncelleme: ben sadece durdurma/iptal edebilir veya çalışan kuyruğunu yeniden nasıl bilmek istiyorum

-(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; 

} 

? Bu mümkün mü? Yardımlarınız için teşekkürler.

cevap

2

örneğin FIFO'yu yürütür seri kuyruğu, kullanmak zorunda: Seri Sevk sıralar için

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 
    }); 
} 

bakmak: http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

+0

Evet, bu problemi çözer! Çok teşekkür ederim. "Self.image" öğesini "dispatch_async (queue,^{") içinde atayım. Şimdi mükemmel çalışıyor! Yine de bu konuyla ilgili belgelere bir göz atacağım. Tekrar teşekkürler. – geforce

2

Neden dispatch_async çağrılarının neden böyle iç içe geçtiğine emin değilim, ama belki de sorun budur. İstediğiniz şeyi gerçekleştirecek gibi bir şey hayal edebiliyorum. UI güncelleştirmesini gerçekten yapmak istediğinizde yalnızca ana sırayı almanız gerekir, diğer her şey arka plan kuyruğunda yapılmalıdır.

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

Teşekkür Steve, ama bu zaten test boyunca hep şeffaf . Bunu yaptığımda, tüm görüntüleri rastgele oluşturulacaktır :) Ama sadece görüntüleri doğru indeks düzeninde birer birer oluşturup ilk görüntüyü göstermem gerekiyor ... Başka bir fikir var mı? – geforce

+0

Hmm, şimdi biraz kafam karıştı. Sadece ilk görüntüyü göstermek istedim ve tüm diğer görüntülerin arka planda olmasını istedin. [Self prerenderImageForIndex: i] yönteminizin bir görüntü almak için bazı ağ araması yaptığını varsayıyordum. Belki de resmin tamamını daha iyi anlamak için bu yöntemi gönderebilirsiniz. – SteveB

+0

Teşekkürler steve, "prerenderImageForIndex" yöntemini ekledim. Umarım bu yardımcı olur ... – geforce

İlgili konular