生成的图像的UIImageView性能问题

时间:2014-12-14 19:21:04

标签: ios swift uikit

我在更新UIImageView的图像方面遇到了一些问题。我使用基本图像,我在显示之前通过绘制来修改。在没有" overlay"的情况下显示时,性能很好。但是当我生成" overlay"时,在更新视图之前需要将近10秒。基本映像是640x430 PNG文件。当图像显示时,我看不到CPU和/或内存使用量的任何高峰 - 所以我不确定它为什么花了这么长时间。如果我将图像更改为我的应用程序中捆绑的某个静态图像,它会立即更改。我在这做任何明显愚蠢的事吗?

我用来生成叠加层的代码如下所示:

func drawTextOverlay(textData:[String : [CGFloat]], sourceImage:UIImage)->UIImage {
    log.debug("Overlay generation started")

    UIGraphicsBeginImageContext(sourceImage.size);
    sourceImage.drawInRect(CGRectMake(0,0,sourceImage.size.width,sourceImage.size.height));

    for letter in textData {
        let toDraw = letter.0
        let pointX = letter.1[0]
        let pointY = (letter.1[1])

        let rect = CGRectMake(pointX, pointY, sourceImage.size.width, sourceImage.size.height)
        let textStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as NSMutableParagraphStyle
        textStyle.alignment = NSTextAlignment.Left
        let textColor = UIColor.redColor()

        let font = UIFont.boldSystemFontOfSize(12);
        let textFontAttributes = [NSFontAttributeName: font, NSForegroundColorAttributeName: textColor, NSParagraphStyleAttributeName: textStyle]

        toDraw.drawInRect(rect, withAttributes: textFontAttributes)
    }

    let newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    log.debug("Overlay generated")
    return newImage;
}

它被调用如下:

self.imageView.image = self.drawOverlay(UIImage(named:"base_image")!)
self.imageView.setNeedsDisplay()

private func drawOverlay(image:UIImage)->UIImage {
    return graphicsService.drawTextOverlay(getKeys(), sourceImage: image)
}

谢谢!

修改

确保将通知发布到主线程,就像这样做了诀窍:

dispatch_async(dispatch_get_main_queue(),{
    NSNotificationCenter.defaultCenter().postNotificationName("NotificationName", object: nil)
});

1 个答案:

答案 0 :(得分:2)

  

视图更新前需要近10秒

这些词几乎总是意味着你试图从后台线程与界面交谈。你绝不能这样做。