2012-06-21 4 views
0

Я использую Grand Central Dispatch, чтобы поставить в очередь задачу захватить UIView в качестве изображения. Все отлично работает с этим, за исключением того, что захват изображения, выполняющийся в очереди, занимает довольно много времени.Использование многопоточности для захвата изображения UIView

Есть ли способ ускорить это или улучшить мою технику. Вот код для захвата и масштабирования изображения, которое затем устанавливается на изображение UIImageView для отображения.

(void)captureScrollViewImageForLayoverView 
{ 
    // capture big map image 
    CGSize size = mainView.bounds.size; 
    UIGraphicsBeginImageContext(size); 
    [[mainView layer] renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // scale map 
    size = myLocationOverlay.bounds.size; 
    UIGraphicsBeginImageContext(size); 
    [newImage drawInRect:CGRectMake(0,0,size.width,size.height)]; 
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    myLocationOverlay.imageMap.image = scaledImage; 
} 

И вот код, стоящий в очереди на задание.

... 
mapImageDrawQueue = dispatch_queue_create("mapImage.drawQueue", NULL); 

(void)captureScrollViewImageForLayoverViewWrapper { 
    // multithreaded approach to draw map 
    dispatch_async(mapImageDrawQueue, ^{ [self captureScrollViewImageForLayoverView]; }); 
} 

ответ

0

Раньше я загружал изображения в очередь в своем приложении с той же проблемой, о которой вы говорили. Я проверил официальное руководство по программированию, вспомнил, что он сказал, что он не может гарантировать, что очередь запускается сразу после ее вызова. Поэтому я использовал NSThread сделать работу, и это хорошо работает:

NSThread* myThread = [[NSThread alloc] initWithTarget:self 
             selector:@selector(captureScrollViewImageForLayoverView) 
             object:nil]; 
[myThread start]; 

Помните добавить эти строки в функции captureScrollViewImageForLayoverView:

В топ: NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; В конце: [pool release];

Проверьте этот документ в знать больше - Threading Programming Guide Надеюсь, это поможет.

+0

Благодарим вас за ответ. Я обязательно сделаю это и дам вам знать, как это работает. – Jomnipotent17

+0

Добро пожаловать, надеюсь, что это сработает. : D – Tom

+0

Эй, я, наконец, обдумал это. Поэтому я использую ARC, поэтому он говорит мне, что я не могу объявить NSAutoreleasePool. Есть ли что-то еще, что нужно сделать вместо этого, или я могу просто опустить эти строки? – Jomnipotent17

Смежные вопросы