3D Touch:在展开Optional值时意外发现nil

时间:2017-01-07 14:54:11

标签: ios swift firebase firebase-storage

为什么imageRef.data总是nil?我在窥视函数中有imageRef.data但它不属于那里?当我偷看时(我假设图像开始下载)它会工作,然后当我在iPhone上用力按压时,图像会显示出来。但大多数时候我都会遇到nil错误。

现在,我已将该逻辑移入pop功能,现在它始终是fatal error: unexpectedly found nil while unwrapping an Optional value

import UIKit
import FirebaseStorage

extension ExpenseFeedVC: UIViewControllerPreviewingDelegate {

    // PEEK
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {

        guard let indexPath = tableView.indexPathForRow(at: location),
            let cell = tableView.cellForRow(at: indexPath) else { return nil}

        guard let expensePreview = storyboard?.instantiateViewController(withIdentifier: "expensePreviewVC") as? ExpensePreviewVC else {return nil }
        expensePreview.selectedItem = expenses[indexPath.row].type
        quickActionString = expenses[indexPath.row].type

        let imageUrl: String = expenses[indexPath.row].receiptUrl
        urlToPass = imageUrl

        expensePreview.preferredContentSize = CGSize(width: 0, height: 150)

        previewingContext.sourceRect = cell.frame

        return expensePreview
    }

    // POP
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {

        if let rvc = storyboard?.instantiateViewController(withIdentifier: "receiptImagePreviewVC") as? ReceiptImagePreviewVC {

            let imageRef = FIRStorage.storage().reference(forURL: urlToPass)
            imageRef.data(withMaxSize: 2*1024*1024, completion: { (data, error) in
                print(data!)

            })

            rvc.poppedImage = self.imageToPass

            show(rvc, sender: self)

        }
    }
}

我把它从"偷看"因为如果我快速强行触摸,我会收到错误。如果我偷看,等几秒钟,然后再按下,我看到图像。最好放置imageRef.data以及为什么datanil(在pop函数中)?

urlToPass始终返回正确的图片网址。

1 个答案:

答案 0 :(得分:0)

异步编程的经典问题 - 下载没有立即发生,这就是为什么它等待几秒后才能运行的原因。你需要这样做:

let imageRef = FIRStorage.storage().reference(forURL: urlToPass)
imageRef.data(withMaxSize: 2*1024*1024, completion: { (data, error) in
  // Check for an error
  ...
  // Prepare to switch to the next VC once the file has downloaded
  rvc.poppedImage = UIImage(data: data!)
  show(rvc, sender: self)
})