2011-08-01 34 views
2

你好,我是新的iPhone開發,所以我可以做到這一切都是錯誤的。我想連續轉換一次圖像3次,但是當我這樣做時,它會鎖定iphone,直到它完成所有3次轉換。我有步驟之間的功能,但他們不會開火,直到最後一個圖像轉換火災。如果你閱讀下面的代碼註釋,這會更有意義。Iphone與圖像工作停止所有進程

我的問題是

  1. 是否有到圖像轉換更快的方法? 2.如何阻止它鎖定,以便它按順序觸發代碼,並且圖像之間的函數將內聯轉換爲火線?

    - (IBAction)ColorFun1 
    { 
        // 
        // ANY CODE IN THIS location will not fire until 3rd convert is finished 
        // 
        // Image to convert 
        UIImage *originalImage = imageView.image; 
    
        // 1st Convert 
    
        CGColorSpaceRef colorSapce = CGColorSpaceCreateDeviceGray(); 
        CGContextRef context = CGBitmapContextCreate(nil, originalImage.size.width,  originalImage.size.height, 8, originalImage.size.width, colorSapce, kCGImageAlphaNone); 
        CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
        CGContextSetShouldAntialias(context, NO); 
        CGContextDrawImage(context, CGRectMake(0, 0, originalImage.size.width, originalImage.size.height), [originalImage CGImage]); 
        CGImageRef bwImage = CGBitmapContextCreateImage(context); 
        // 
        CGContextRelease(context); 
        CGColorSpaceRelease(colorSapce); 
        // 
        UIImage *resultImageBW = [UIImage imageWithCGImage:bwImage]; // This is result B/W image. 
        [fxImage2View setImage:resultImageBW]; 
    
    
    
        // 
        // ANY CODE IN THIS location will not fire until 3rd convert is finished 
    
        // 
    
        // 
        // 
        // 2nd Convert 
    
        // 
    
        UIGraphicsBeginImageContext(resultImageBW.size); 
    
        CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy); 
    
        [resultImageBW drawInRect:CGRectMake(0, 0, resultImageBW.size.width, resultImageBW.size.height)]; 
    
        CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeDifference); 
    
    
        CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(),[UIColor grayColor].CGColor); 
    
        CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, resultImageBW.size.width, resultImageBW.size.height)); 
    
        UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext(); 
        [fxImage1View setImage:returnImage]; 
        UIGraphicsEndImageContext();  
    
        // 
        // 
    
        // 
        // ANY CODE IN THIS location will not fire until 3rd convert is finished 
        // 
        // 
    
        // 
        // 3rd Convert 
    
        // 
    
        UIGraphicsBeginImageContext(resultImageBW.size); 
    
        CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy); 
    
        [resultImageBW drawInRect:CGRectMake(0, 0, resultImageBW.size.width, resultImageBW.size.height)]; 
    
        CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeSoftLight); 
    
    
        CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(),[UIColor colorWithRed:40 green:20 blue:0 alpha:1].CGColor); 
    
        CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, resultImageBW.size.width, resultImageBW.size.height)); 
    
        returnImage = UIGraphicsGetImageFromCurrentImageContext(); 
        [fxImage3View setImage:returnImage]; 
        UIGraphicsEndImageContext();  
    
        CGImageRelease(bwImage); 
    
    } 
    

回答

0

我認爲你的問題依賴於事實,因爲你正在做一堆加工的無控制權返回到主循環,你的UI不會更新之間。

你有一種可能性是定義三種方法,每種方法進行一次圖像轉換(這也將有助於代碼的可讀性)。然後,您可以通過調用流程控制回到主循環並更新UI的方式調用它們。

舉個例子,如果你的3個方法是convertImage1convertImage2,並convertImage3,你可以這樣做:

[self performSelector:@selector(convertImage1) withObject:nil afterDelay:0]; 
[self performSelector:@selector(convertImage2) withObject:nil afterDelay:0]; 
[self performSelector:@selector(convertImage3) withObject:nil afterDelay:0]; 

同樣的效果可以在一個更清潔的方式來獲得,如果你使用大中央調度dispatch_async方法派遣你的電話:

dispatch_async(dispatch_get_main_queue(), ^{ [self convertImage1]; }); 
dispatch_async(dispatch_get_main_queue(), ^{ [self convertImage2]; }); 
dispatch_async(dispatch_get_main_queue(), ^{ [self convertImage3]; }); 

有許多設計變量,你可以在這裏調整;這只是一個給你一個想法的例子。

2

您需要將控制權轉移回運行循環,就像sergio說的那樣。我建議尋找大中央派遣。來自維基百科

Grand Central Dispatch仍然使用低級別的線程,但將它們從程序員中抽象出來,他們不需要關心儘可能多的細節。 GCD中的任務輕量級創建和排隊;蘋果公司指出,15個指令必須排隊一個工作單位在GCD,同時創造一個傳統的線程可以很容易地需要幾百說明

它不應該是很難找到關於如何實現它的教程。你甚至可以考慮斯坦福大學的開發講座。 This談論性能&線程。我認爲與你有關的那部分始於33:36。

+0

+1,GCD是正確的方法。 –