2017-01-16 15 views
0

イメージのサイズを変更するこのメソッドを作成しました。マルチスレッドのuiimageサイズ変更エラー

+ (UIImage *)imageFromImage:(UIImage *)image scaledToSize:(CGSize)newSize { 
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); 
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

すべてが正常に動作しますが、私はdrawInRect:

でそれがクラッシュし、別のスレッドで、このメソッドを呼び出した場合、私は別のスレッドで、このメソッドを呼び出すためにこれらの行を使用します。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    for (int i = 0; i < [images count]; i++){ 

     UIImage *img = [UIImage imageWithContentsOfFile:[images objectAtIndex:i]]; 
     CGFloat wImg = img.size.width * imageViewSize/img.size.height; 
     CGSize size = CGSizeMake(wImg, imageViewSize); 
     img = [Utility imageFromImage:img scaledToSize:size]; 

    } 
}); 

どのようにすることができます私がやります?

+0

メインキューのUIスタッフを呼び出す必要があります。 – shallowThought

+0

私はバックグラウンドでイメージ処理を行うことができませんか? – Pol

答えて

1

前述のように、メインスレッド以外のスレッドのUIクラスには注意が必要です。代わりにCore Graphicsを使用してみてください。

変更この行:

[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 

へ:

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextConcatCTM(context, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, newSize.height), 1.f, -1.f)); 
CGContextDrawImage(context, CGRectMake(0, 0, newSize.width, newSize.height), image.CGImage); 

それはUIKitのDrawInRectのように働くように、2行目は、あなたのY軸を反転します。

+0

すべて今はうまく動作します! – Pol

0

経験則として、常にメインスレッドでUIの処理を行います。 がバックグラウンドでを行うことができますどのような詳細な情報については、あなたが慎重にマニュアルを確認する必要が

ないすべてのUIKitクラスはスレッドセーフです。アプリのメインスレッド以外のスレッドで描画関連の操作を行う前に、ドキュメントを必ず確認してください。

Apples documentation

this answerによると、動作はiOSバージョンに固有のようです。

関連する問題