2015-03-05 29 views
7

Mam aplikację, która tworzy unikatową galerię zdjęć dla każdego biletu w mojej aplikacji. Muszę dowiedzieć się, jak przeglądać tę galerię, aby przesyłać obrazy na serwer po jednym na raz. Śledziłem te tutoriale na youtube. (Video) Obecnie używam Swift jako mojego języka. moim ostatecznym celem byłoby mieć coś takiego następującego pseudo kodu.Jak przeglądać galerię zdjęć w trybie błyskawicznym ze zdjęciami:

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

//this function works already 

func uploadToServer(photo:UIImage) 
{ 
    callRest 
    postPhoto 
} 

Oto mój kod do tej pory nie może dowiedzieć się, jak przechodzić. je jednak.

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")*/ 


     }) 
    } 
} 
+0

śmiało. Jaka jest trudna część? – matt

+0

Mam problem z tym, co należy przeglądać, jestem nowy na szybki i iOS devlopment. Próbowałem zapętlić w moim PHAssetCollection, nie pozwól mi więc próbowałem pętli przez moje PHFetchResults samo. Nie wiem, jak działa framework do zdjęć. – Spikehockey75

+0

Czy obejrzałeś film WWDC o ramce Zdjęcia? To całkiem proste. – matt

Odpowiedz

8

Po kilku badaniach i wskazówkach od Matta odkryłem to. Oto jak to zrobić. Upewnij się, że robisz to również w głównym wątku, więc musisz ustawić opcje options.synchronous = true. Jeśli nie z jakiegoś powodu nie ma żadnej wartości dla zdjęć.

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)") 
} 
+0

Dzięki milionowi kolego ... Zmarnowałem dwa dni przeszukując to przez internet .. !! –

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) 
      } 
     } 
    } 
+0

Jak pobrać filmy od 10 do 20, na przykład chcę pokazać wideo przy użyciu stronicowania, więc chcę pobrać od 0 do 10, od 10 do 20 ... itd. – user