2012-05-04 25 views
5

Tôi chỉ muốn hiển thị trước các hình ảnh khác nhau để truy cập nhanh. Tôi sử dụng công văn trung tâm lớn ở đây để thực hiện các khối khác nhau.Grand Central Dispatch - hiển thị hình ảnh đầu tiên khi nó được tải?

Sau khi bắt đầu hàng đợi, tôi muốn đặt hình ảnh đầu tiên khi thực hiện xong. Với mã hiện tại bên dưới, rất tiếc, hình ảnh đầu tiên sẽ chỉ được hiển thị khi tất cả hình ảnh đã được hiển thị.

Vậy làm cách nào tôi có thể sửa đổi mã? Có thể nhận được một đại biểu khi mỗi hình ảnh đã hoàn thành?

Here's mã:

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

Cập nhật:

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

} 

tôi chỉ muốn biết làm thế nào để hủy/dừng hoặc khởi động lại một hàng đợi chạy? Có thể không? Cảm ơn sự giúp đỡ của bạn.

Trả lời

2

bạn phải sử dụng một hàng đợi nối tiếp, trong đó thực hiện FIFO ví dụ:

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

cho hàng đợi công văn nối tiếp xem xét: http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

+0

Vâng, điều đó giải quyết được vấn đề! Cảm ơn nhiều. Tôi gán "self.image" trong "dispatch_async" (hàng đợi,^{". Bây giờ nó hoạt động hoàn hảo! Tuy nhiên tôi sẽ có một cái nhìn tại các tài liệu về điều đó. Cảm ơn một lần nữa. – geforce

2

Tôi không chắc chắn lý do tại sao bạn có các cuộc gọi dispatch_async lồng nhau như thế này nhưng có thể đó là vấn đề. Tôi sẽ tưởng tượng một cái gì đó như dưới đây sẽ thực hiện những gì bạn muốn. Bạn chỉ cần nhận hàng đợi chính khi bạn thực sự muốn cập nhật giao diện người dùng, mọi thứ khác sẽ được thực hiện trên hàng đợi nền.

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

Cảm ơn Steve, nhưng Tôi đã thử nghiệm đó đã . Khi tôi làm như vậy, tất cả hình ảnh của tôi sẽ được hiển thị ngẫu nhiên :) Nhưng tôi chỉ cần hiển thị từng hình một theo thứ tự chỉ mục chính xác và hiển thị hình ảnh đầu tiên ... Bất kỳ ý tưởng nào khác? – geforce

+0

Hmm, vì vậy tôi hơi bối rối một chút. Tôi nghĩ bạn chỉ muốn hiển thị hình ảnh đầu tiên và để tất cả các hình ảnh khác tải trong nền. Tôi đã giả định rằng phương pháp [self prerenderImageForIndex: i] của bạn đã thực hiện một số cuộc gọi mạng để có được một hình ảnh. Có lẽ bạn có thể đăng phương pháp đó để cho tôi hiểu rõ hơn về toàn bộ bức tranh. – SteveB

+0

Cảm ơn steve, tôi chỉ cần thêm phương thức "prerenderImageForIndex". Hy vọng rằng sẽ giúp ... – geforce

Các vấn đề liên quan