簡體   English   中英

Xcode-iOS-AWS S3-首次下載時未出現下載的圖像

[英]Xcode - iOS - AWS S3 - Downloaded Image Doesn't Appear On First Download

這是我用於從AWS S3服務器下載圖像並將其分配為在圖像視圖中顯示的圖像的代碼:

    let s3BucketName = "bucketName"
    let fileName = Globals.currAuthorName.filter { $0 != Character(" ") } + ".jpg"

    let downloadFilePath = NSTemporaryDirectory().stringByAppendingPathComponent(fileName)
    let downloadingFileURL = NSURL.fileURLWithPath(downloadFilePath)

    // Create a credential provider for AWS requests
    let credentialsProvider = AWSCognitoCredentialsProvider(
        regionType: AWSRegionType.USEast1,
        identityPoolId: "us-east-1:********-****-****-****-************")

    // Create a service configuration for AWS requests
    let defaultServiceConfiguration = AWSServiceConfiguration(
        region: AWSRegionType.USEast1,
        credentialsProvider: credentialsProvider)

    // Create a new download request to S3, and set its properties
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration

    let downloadRequest = AWSS3TransferManagerDownloadRequest()
    downloadRequest.bucket = s3BucketName
    downloadRequest.key  = "folderName/" + fileName
    downloadRequest.downloadingFileURL = downloadingFileURL

    let transferManager = AWSS3TransferManager.defaultS3TransferManager()
    transferManager.download(downloadRequest)

    // Set the UIImageView to show the file that was downloaded
    let image = UIImage(contentsOfFile: downloadFilePath)
    authorImage.contentMode = UIViewContentMode.ScaleAspectFit
    authorImage.image = image

問題是,當我運行iOS模擬器並導航到適當的頁面時,第一次訪問該頁面時從未加載該圖像。 但是,當我離開頁面導航然后返回頁面時,以及以后每次訪問該頁面時,總是會加載該頁面。 當我停止運行該應用程序,然后再次啟動它並再次訪問該頁面時,該圖像仍處於加載狀態。 僅在我第一次訪問某個iOS模擬器的頁面時才未加載該圖像(即在iPhone 6模擬器,iPhone 5模擬器等中一次發生)

我試圖通過添加以下代碼來解決此問題:

while (image == nil) {
  transferManager.download(downloadRequest)
  let image = UIImage(contentsOfFile: downloadFilePath)
}

但這只是在我第一次訪問頁面時導致了一個無限的while循環。 控制台最終也會輸出此錯誤:

2015-07-06 23:26:28.529 CCBF [19839:92323] 19839:CFNetwork內部錯誤(0xc01a:/SourceCache/CFNetwork_Sim/CFNetwork-711.3.18/Foundation/NSURLRequest.mm:798)2015-07-06 23: 26:28.564 AuthorProject [19839:92323] AWSiOSSDKv2 [錯誤] AWSURLSessionManager.m行:240 | __41- [AWSURLSessionManager taskWithDelegate:] _ block_invoke222 | 無效的AWSURLSessionTaskType。

編輯:

我試圖實現以下continuewithblock:

var image : UIImage!

let task = transferManager.download(downloadRequest)
task.continueWithBlock({
    if task.error != nil {
        println(task.error)
    } else {
        dispatch_async(dispatch_get_main_queue(), {
            image = UIImage(contentsOfFile: downloadFilePath)
            self.authorImage.contentMode = UIViewContentMode.ScaleAspectFit
            self.authorImage.image = image
        })
    }
    return nil
}())

但是,當我運行它並嘗試加載圖像時,出現運行時錯誤,該錯誤使我指向“ continueWithExecutor”方法的代碼。 具體來說,這行代碼:

result = block(self);

消息是:

EXC_BAD_ACCESS(代碼:1,地址= 0x10)

編輯2:

我似乎找到了一種可行的解決方案:

var image : UIImage!

    let taskTODO = transferManager.download(downloadRequest)
    taskTODO.continueWithBlock{ (task: AWSTask!) -> AnyObject! in
        if task.error != nil {
            println(task.error)
        } else {
            dispatch_async(dispatch_get_main_queue(), {
                image = UIImage(contentsOfFile: downloadFilePath)
                self.authorImage.contentMode = UIViewContentMode.ScaleAspectFit
                self.authorImage.image = image
            })
        }

        return nil
    }

這似乎是正確的方法嗎?

transferManager.download(downloadRequest)是異步的,這意味着大約需要20毫秒來下載映像。 但是,第一次進入屏幕時,您嘗試立即分配圖像(尚未下載)。 在隨后的屏幕加載中-圖片已經下載並緩存-因此可以立即顯示。 您需要一個完成塊,該完成塊指示圖像何時完成下載並准備好顯示,並且在該塊中您應分配圖像。 請參見下面的示例:

let readRequest1 : AWSS3TransferManagerDownloadRequest = AWSS3TransferManagerDownloadRequest()
    readRequest1.bucket = "shrikar-picbucket"
    readRequest1.key =  "bingo"
    readRequest1.downloadingFileURL = downloadingFileURL1

    let task = transferManager.download(readRequest1)
    task.continueWithBlock { (task) ->; AnyObject! in
        println(task.error)
        if task.error != nil {
        } else {
            dispatch_async(dispatch_get_main_queue()
                , { () ->; Void in
                    self.selectedImage.image = UIImage(contentsOfFile: downloadingFilePath1)
                    self.selectedImage.setNeedsDisplay()
                    self.selectedImage.reloadInputViews()

            })
            println("Fetched image")
        }
        return nil
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM