【问题标题】:How to loop through a photo gallery in swift with photos framework如何使用照片框架快速循环浏览照片库
【发布时间】:2015-05-07 06:25:02
【问题描述】:

我有一个应用程序,可以为我的应用程序上的每张票创建一个独特的照片库。我需要弄清楚如何遍历该图库,以便一次将图像上传到服务器。我在 youtube 上关注了这些教程。 (Video) 我目前使用 Swift 作为我的语言。我的最终目标是拥有类似下面的伪代码。

//I need the following for loop example
for photo in gallery
{
    uploadToServer(photo)
}

//this function works already

func uploadToServer(photo:UIImage)
{
    callRest
    postPhoto
}

这是我的代码到目前为止无法弄清楚如何循环。不过他们。

let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "title = %@", self.albumName)?
let collection:PHFetchResult = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .Any, options: fetchOptions)

if let first_Obj:AnyObject = collection.firstObject{
    //found the album
    self.assetCollection = collection.firstObject as PHAssetCollection
    self.albumFound = true
}
else { albumFound = false }
var i = collection.count
self.photoAssets = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil)


self.photoAssets.enumerateObjectsUsingBlock{(object: AnyObject!,
    count: Int,
    stop: UnsafeMutablePointer<ObjCBool>) in

    if object is PHAsset{
        let asset = object as PHAsset
        println("Inside  If object is PHAsset, This is number 1")

        let imageSize = CGSize(width: asset.pixelWidth,
            height: asset.pixelHeight)

        /* For faster performance, and maybe degraded image */
        let options = PHImageRequestOptions()
        options.deliveryMode = .FastFormat

        imageManager.requestImageForAsset(asset,
            targetSize: imageSize,
            contentMode: .AspectFill,
            options: options,
            resultHandler: {
                (image, info)->Void in

                self.photo = image

                var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
                var server = defaults.objectForKey("imageServer") as String!
                var error: NSError? = nil

                var imageData = UIImageJPEGRepresentation(self.photo, 90)
                var url = NSURL(string: server)
                var request = NSMutableURLRequest(URL: url!)
                request.HTTPMethod = "POST"
                //request.setValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
                request.HTTPBody = imageData

                var response: NSURLResponse? = nil

                let reply = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&error)

                let results = NSString(data:reply!, encoding:NSUTF8StringEncoding)
                println("API Response: \(results)")

                /*
                /* The image is now available to us */
                self.sendPhotos(image)
                println("enum for image, This is number 2")*/


        })
    }
}

【问题讨论】:

  • 继续吧。最难的是什么?
  • 我不知道要循环什么,我是 swift 和 iOS 开发的新手。我尝试循环通过我的 PHAssetCollection,不会让我,所以我尝试循环通过我的 PHFetchResults 相同的东西。我不确定照片框架是如何工作的。
  • 你看过关于 Photos 框架的 WWDC 视频吗?这很简单。
  • 我确实看了视频,刚才又看了一遍。它没有解释如何像数组一样循环图像。至少我不了解如何“获取”它们。我将使用我的代码添加到我的帖子中
  • 很好,所以您使用的是fetchAssetsInAssetCollection。因此,请查看它的文档。它返回什么?它返回一个 PHFetchResult。所以你的self.photoAssets 一个PHFetchResult。所以现在查看 PHFetchResult 的文档!你看到了什么?你注意到什么了吗?有什么方法可以帮助您(提示提示)*enumerate* 这些结果?

标签: ios swift image-uploading photosframework


【解决方案1】:

因此,经过马特的一些研究和指导,我想通了。这是如何做到这一点的。确保您也在主线程上执行此操作,因此您必须设置 options.synchronous = true。如果不是出于某种原因,它对照片没有任何价值。

func getSyncPhotos()
{
    self.albumName = String(self.ticket_id!)

    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "title = %@", self.albumName)?
    let collection:PHFetchResult = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .Any, options: fetchOptions)

    if let first_Obj:AnyObject = collection.firstObject{
        //found the album
        self.assetCollection = collection.firstObject as PHAssetCollection
        self.albumFound = true
    }
    else { albumFound = false }
    var i = collection.count
    self.photoAssets = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil)
    let imageManager = PHCachingImageManager()

    self.photoAssets.enumerateObjectsUsingBlock{(object: AnyObject!,
        count: Int,
        stop: UnsafeMutablePointer<ObjCBool>) in

        if object is PHAsset{
            let asset = object as PHAsset
            println("Inside  If object is PHAsset, This is number 1")

            let imageSize = CGSize(width: asset.pixelWidth,
                height: asset.pixelHeight)

            /* For faster performance, and maybe degraded image */
            let options = PHImageRequestOptions()
            options.deliveryMode = .FastFormat
            options.synchronous = true
            imageManager.requestImageForAsset(asset,
                targetSize: imageSize,
                contentMode: .AspectFill,
                options: options,
                resultHandler: {
                     image, info in
                    self.photo = image!
                    /* The image is now available to us */
                    self.sendPhotos(self.photo)
                    println("enum for image, This is number 2")


            })
        }
    }
}

func sendPhotos(uploadImage:UIImage)
{

    var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
    var server = defaults.objectForKey("imageServer") as String!
    var error: NSError? = nil

    var imageData = UIImageJPEGRepresentation(uploadImage, 90)
    var url = NSURL(string: server)
    var request = NSMutableURLRequest(URL: url!)
    request.HTTPMethod = "POST"
    //request.setValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
    request.HTTPBody = imageData

    var response: NSURLResponse? = nil

    let reply = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&error)

    let results = NSString(data:reply!, encoding:NSUTF8StringEncoding)
    println("API Response: \(results)")
}

【讨论】:

  • 谢谢一百万好友...我浪费了两天时间在互联网上搜索这个..!!
  • 在获取所有图像之前,不会释放使用此代码的内存。如果我在此任务完成之前关闭视图控制器,则会导致内存泄漏。
【解决方案2】:
func fetchVideoFromLibrary() {
       let fetchOptions: PHFetchOptions = PHFetchOptions()
       fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
       let fetchResult = PHAsset.fetchAssetsWithMediaType(.Video, options: fetchOptions)
       fetchResult.enumerateObjectsUsingBlock { (object, index, stop) -> Void in
           let options = PHImageRequestOptions()
           options.synchronous = true
           options.deliveryMode = .HighQualityFormat
           PHImageManager.defaultManager().requestAVAssetForVideo(object as! PHAsset, options: .None) { (avAsset, avAudioMix, dict) -> Void in
               print(avAsset)
           }
       }
   }

【讨论】:

  • 如何获取从 10 到 20 的视频,例如我想使用分页显示视频,所以想获取 0 到 10、10 到 20 .... 等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
相关资源
最近更新 更多