2015-05-24 3 views
1

Я генерирую QR-код для ввода в UIImage. Я запускаю функцию генерации асинхронно, но по какой-то причине приложение вылетает, когда я запускаю его на своем телефоне, но не сбой в симуляторе. Я не совсем уверен, что происходит ... Любые идеи?Асинхронная функция, вызывающая сбой

Настройка изображения

let QR = UIImageView() 

dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) { // 1 

    var img = self.generateQRImage(self.arr[sender.tag],withSizeRate: self.screenWidth-40) 
    dispatch_async(dispatch_get_main_queue()) { // 2 
     QR.image = img 
    } 
} 

QR.frame = CGRectMake(0,0,screenWidth-40,screenWidth-40) 
QR.center = CGPoint(x:screenWidth/2,y:screenHeight/2) 
sView.addSubview(QR) 

Генерация QR

func generateQRImage(stringQR:NSString, withSizeRate rate:CGFloat) -> UIImage 
    { 
     var filter:CIFilter = CIFilter(name:"CIQRCodeGenerator") 
     filter.setDefaults() 

     var data:NSData = stringQR.dataUsingEncoding(NSUTF8StringEncoding)! 
     filter.setValue(data, forKey: "inputMessage") 

     var outputImg:CIImage = filter.outputImage 

     var context:CIContext = CIContext(options: nil) 
     var cgimg:CGImageRef = context.createCGImage(outputImg, fromRect: outputImg.extent()) 

     var img:UIImage = UIImage(CGImage: cgimg, scale: 1.0, orientation: UIImageOrientation.Up)! 

     var width = img.size.width * rate 
     var height = img.size.height * rate 

     UIGraphicsBeginImageContext(CGSizeMake(width, height)) 
     var cgContxt:CGContextRef = UIGraphicsGetCurrentContext() 
     CGContextSetInterpolationQuality(cgContxt, kCGInterpolationNone) 
     img.drawInRect(CGRectMake(0, 0, width, height)) 
     img = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return img 
    } 
+1

, что сообщение об ошибке сказать и то, что стек трассировки шоу? – Icaro

+0

2015-05-24 18: 37: 41.084 Klikr [279: 8851] BSXPCMessage получил сообщение об ошибке: Прерывание соединения 2015-05-24 18: 37: 49.401 Klikr [279: 8851] Прекращение действия, так как нет системного приложения. – SpaceShroomies

+0

Посмотрите в этом посте он может ответить на ваш вопрос http://stackoverflow.com/questions/26065808/bsxpcmessage-received-error-for-message-connection-interrupted – Icaro

ответ

1

Намерение withSizeRate явно будет коэффициент масштабирования для применения к QR-изображения (который 27x27). Но вы используете ширину экрана как множитель. Это приводит к чрезвычайно большому изображению (после того, как он несжатый, используется в представлении изображения, не идет по размеру полученного файла JPEG/PNG). Теоретическое внутреннее несжатое представление этого изображения чрезвычайно велико (300 мб на iPhone 6 и почти 400 МБ на iPhone 6+). Когда я побежал через симулятор iPhone 6, использование памяти на самом деле подскочили до 2,4 ГБ:

enter image description here

Я предложил бы использовать меньший коэффициент масштабирования. Или просто создайте образ, который точно соответствует размеру изображения (хотя для шкалы используйте UIGraphicsBeginImageContextWithOptions).


Например, вы могли бы просто передать CGSize о представлении изображения в generateQRImage, а также настроить метод, как так:

func generateQRImage(stringQR: String, size: CGSize) -> UIImage { 
    let filter = CIFilter(name:"CIQRCodeGenerator") 
    filter.setDefaults() 

    let data = stringQR.dataUsingEncoding(NSUTF8StringEncoding)! 
    filter.setValue(data, forKey: "inputMessage") 

    let outputImage = filter.outputImage 

    let context = CIContext(options: nil) 
    let cgImage = context.createCGImage(outputImage, fromRect: outputImage.extent()) 

    var image = UIImage(CGImage: cgImage, scale: 1.0, orientation: UIImageOrientation.Up)! 

    let width = size.width 
    let height = size.height 

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), true, 0) 
    let cgContext = UIGraphicsGetCurrentContext() 
    CGContextSetInterpolationQuality(cgContext, kCGInterpolationNone) 
    image.drawInRect(CGRectMake(0, 0, width, height)) 
    image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return image 
}