2017-01-28 3 views
1

Я использую CloudKit для сохранения записей, введенных пользователем, однако мое приложение падает.Ошибка приложения при сохранении записи в CloudKit

Ниже мой код:

func saveRecordToCloud(_ pinpoint:Details!) -> Void { 
    // Prepare the record to save 
    let record = CKRecord(recordType: "Details") 
    record.setValue(pinpoint.title, forKey: "title") 
    record.setValue(pinpoint.location, forKey: "location") 
    record.setValue(pinpoint.date, forKey: "date") 

    // Resize the image 
    let originalImage = UIImage(data: pinpoint.image as Data)! 
    let scalingFactor = (originalImage.size.width > 1024) ? 1024/originalImage.size.width : 1.0 
    let scaledImage = UIImage(data: pinpoint.image as Data, scale: scalingFactor)! 

    // Write the image to local file for temporary use 
    let imageFilePath = NSTemporaryDirectory() + pinpoint.title 
    try? UIImageJPEGRepresentation(scaledImage, 0.8)?.write(to: URL(fileURLWithPath: imageFilePath), options: [.atomic]) 

    // Create image asset for upload 
    let imageFileURL = URL(fileURLWithPath: imageFilePath) 
    let imageAsset = CKAsset(fileURL: imageFileURL) 
    record.setValue(imageAsset, forKey: "image") 


    // Get the Public iCloud Database 
    let publicDatabase = CKContainer.default().publicCloudDatabase 

    // Save the record to iCloud 
    publicDatabase.save(record, completionHandler: { (record:CKRecord?, error:NSError?) -> Void in 
     // Remove temp file 
     do { 
      try FileManager.default.removeItem(atPath: imageFilePath) 

     } catch { 
      print("Failed to save record to the cloud: \(error)") 
     } 
     } as! (CKRecord?, Error?) -> Void) 
} 

Ошибка я получаю это:

Тема 1: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкодовое = 0x0)

Это на линия } as! (CKRecord?, Error?) -> Void), которая является второй последней.

Я использую Swift 3,0

+0

Какая линия вызывает крушение? – Pierce

+0

@Pierce Линия, которая говорит '} как! (CKRecord ?, Error?) -> Void) ', которая является последней строкой. Я добавлю это к вопросу. –

+0

Я знаю, что это такое -> Я отправлю ответ. Это произошло после преобразования вашего проекта из старой версии Swift в Swift 3? – Pierce

ответ

1

У меня была эта точно такая же проблема, когда я преобразовал мой старый проект Swift 2.x Свифта 3. Они принимают обработчики завершения CloudKit, и вместо того, чтобы преобразовать их в Swift 3 - он оставляет его в Swift 2, а затем бросает его как CKCompletionHandler для Swift 3. Он всегда вызывает сбой. Удалите строку, которая сообщает as! (CKRecord?, Error?) -> Void) с конца вашего обработчика завершения. Затем вернитесь к фактическому обработчику завершения, и изменить его, чтобы выглядеть следующим образом:

publicDatabase.save(record, completionHandler: { (record:CKRecord?, error: Error?) in 
    // Remove temp file 
    do { 
     try FileManager.default.removeItem(atPath: imageFilePath) 

    } catch { 
     print("Failed to save record to the cloud: \(error)") 
    } 
} 

В принципе вы просто должны изменить NSError к Error, и вы можете избавиться от (возвращает ничтожные) линий -> void. Это лишнее. Дай мне знать, если это работает.

+0

Отлично! Спасибо, Пирс. –

+0

@ AnnabelleSykes - Уверенная вещь ... Удачи! – Pierce

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