[英]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.