2016-03-31 18 views
0

Kullanıcıların düğün resimlerini gösteren bir iOS uygulaması yapıyorum. Bir görüntü dosyasının ortalama boyutu yaklaşık 1,5 Mb'dir. Ancak resimler bittiğinde (10'dan fazla resim) uygulama çöküyor. Bu sorunu çözmek için herhangi bir çözüm var mı? Temel verileri uygulamayı düşünüyordum. Yardımcı olacak mı? Eğer değilse lütfen bana yardım edin. (: Self.userId, self.albumId, "http://webphotobooks.in/webphotobook/index.php/web_controller/fetch1?id=%@&album_id=%@" formatında)Büyük boyuttaki resimlerin yüklenmesi, Swift 2.0 uygulamasında çökmeler yaşanmasına neden oluyor

let urlString :String = url.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
    //print(urlString, terminator: "") 

    let request : NSMutableURLRequest = NSMutableURLRequest() 
    request.URL = NSURL(string: urlString as String) 
    request.HTTPMethod = "GET" 

    var response: NSURLResponse? 

    let data = (try? NSURLConnection.sendSynchronousRequest(request, returningResponse: &response)) as NSData? 

    if let httpResponse = response as? NSHTTPURLResponse { 
     //print("error \(httpResponse.statusCode)") 

     let statusCode = httpResponse.statusCode 
     if statusCode == 200 
     { 
      do 
      { 
       let jsonResult: NSDictionary! = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as! NSDictionary 
       //print(jsonResult, terminator: "") 

       if (jsonResult != nil) 
       { 

        if (jsonResult?.objectForKey("messagge") as! String == "successfull") 
        { 
         self.array = jsonResult.valueForKey("images") as! NSArray 
         // print(self.array) 

         self.collectionView.reloadData() 
        } 

        else 
        { 
         if #available(iOS 8.0, *) { 
          let alert = UIAlertController(title: "Error", message: "Unable to fetch images", preferredStyle: UIAlertControllerStyle.Alert) 

          alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)) 
          alert.view.tintColor = UIColor.blackColor() 

          self.presentViewController(alert, animated: true, completion: nil) 

         } 
         else 
         { 
          let alert = UIAlertView(title: "Error", message: "Unable to fetch images", delegate: self, cancelButtonTitle: "Ok") 
          alert.show() 
         } 

        } 
       } 
      } 
      catch let error as NSError 
      { 
       print(error) 
      } 
     } 
     else 
     { 
      if #available(iOS 8.0, *) { 
       let alert = UIAlertController(title: "Error", message: "Please check your internet connection", preferredStyle: UIAlertControllerStyle.Alert) 

       alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)) 
       alert.view.tintColor = UIColor.blackColor() 

       self.presentViewController(alert, animated: true, completion: nil) 

      } 
      else 
      { 
       let alert = UIAlertView(title: "Error", message: "Please check your internet connection", delegate: self, cancelButtonTitle: "Ok") 
       alert.show() 
      } 

     } 
    } 

} 


func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
    //#warning Incomplete method implementation -- Return the number of sections 
    return 1 
} 


func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    //#warning Incomplete method implementation -- Return the number of items in the section 
    return self.array.count 
} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
{ 
    let cell:HomeCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("HomeCell", forIndexPath: indexPath) as! HomeCollectionViewCell 
    if let images = cell.profileImage 
    { 
     if !(array.valueForKey("image_name").objectAtIndex(indexPath.row).isKindOfClass(NSNull)) 
     { 
      let Str = array.valueForKey("image_name").objectAtIndex(indexPath.row) as! String 

      let block: SDWebImageCompletionBlock! = {(image: UIImage!, error: NSError!, cacheType: SDImageCacheType, imageURL: NSURL!) -> Void in 
       // print(image) 
      } 
      let urlStr = NSString(format: "http://webphotobooks.in/admin/uploads/category_pics/%@", Str) 
      //print(urlStr) 
      let urlString :String = urlStr.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
      //print(urlString) 
      let url = NSURL(string: urlString as String) 
      //print(url) 

      images.sd_setImageWithURL(url, completed: block) 
     } 
    } 
    actInd.stopAnimating() 
    return cell 
} 
+0

Kodunuzu ve nasıl kilitlendiğini gösterir. 'UIImage (contentOfFile:) 'başlatıcısı –

+0

kullanarak yüklemeyi deneyin Ben görüntüleri bir örnek verebilir –

cevap

1

ortalama büyüklüğü

Bu

benim kod

fonk webservice() { let url = NSString olduğunu bir görüntünün yaklaşık değeri 1,5 Mb'dir

Bu, dosya boyutu boyutudur, eğer jpg ise muhtemelen sıkıştırılmış. Bir kez bellekte açıldığında bir görüntü num_pixel_height * num_pixel_width * num_channel * bit_for_channel alır. Örneğin, 200px * 200px kanal için 8 bitlik bir görüntü RGBA yaklaşık 625kb'dir, ancak sıkıştırma nedeniyle dosya boyutu çok daha küçük olabilir.

+0

yüklemek için SDWebImages kullanıyorum lütfen? –

+0

Zaten yaptım, uygulamanız bellek baskısı nedeniyle çöküyor. Bu boyutta 10 görüntü işleyemez. Net bir cevap istiyorsanız, ek veri, kod vb. Ekleyerek size soru sormalısınız. Örneğin, tüm 10 resmi bir defada görüntülemeniz gerekiyor mu? Onlardan nasıl kurtuldun? – Andrea

1

Çok fazla bellek harcadığınız için kesinlikle çökecektir. Bunun tek çözümü, küçük boyutlu görüntüleri getirmektir veya görüntüyü getirdikten sonra sıkıştırır. Tüm boyuttaki görüntüleri belleğe yükleyemezsiniz. Arka taraftaki görüntülerin sıkıştırılması için birçok seçenek vardır. Görüntüleri arka planda kendisi sıkıştırabilir, bu da uygulamadaki çalışmanızı azaltabilir.

Gerçek resmi de görmek isteyebilirsiniz. Ardından, görüntüye dokunduktan sonra gerçek görüntüyü indirebilirsiniz. Başlangıçta daha küçük resimler getirmelisiniz. Her uygulama aynı şeyi yapar. Bu amaçla önbelleğe alma işlemlerini bile gerçekleştirebilen birçok açık kaynaklı görüntü önbellek kitaplığı vardır. Böyle bir örnek SD-WebImage