2015-03-01 2 views
2

Я надеюсь, что кто-то может мне помочь, я уже искал Stackoverflow и Google, но я не мог найти правильное решение. У меня очень простое приложение, которое снимает фотографию (используя стандартную камеру iOS через UIImagePickerController), затем я сохраняю ее в файловой системе с очень низким разрешением - let thumbNailData = UIImageJPEGRepresentation(image, 0.02) после этого я показываю изображения в виде коллекции с использованием Core Data - Я сохраняю только имя файла в Core Data, а не изображение, изображение только в файловой системе. Итак, когда я запускаю приложение, он показывает мне использование памяти не более 15 МБ, а процесс - около 1-2%. Все работает нормально, но после добавления 6-7 фотографий я получаю странные ошибки как предупреждения памяти, потеряла связь с моим iPhone, и это на:Предупреждение о наличии памяти в приложении iOS 8 - но использование низкое

Communications error: <OS_xpc_error: <error: 0x198adfa80> { count = 1, contents = 
    "XPCErrorDescription" => <string: 0x198adfe78> { length = 22, contents = "Connection interrupted" 

Итак, я действительно застрял, я думал, что я сделал это очень легким и то я получаю эти ошибки .... Я уже представил приложение для заметок в App Store, которое было гораздо более функциональным, чем этот, но этот работает очень стабильно ...

Любые идеи?

Вот некоторые из моего кода: // Здесь я загружаю имена изображений в массив для отображения в представлении коллекции

func loadColl() { 
     let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) 
     let context:NSManagedObjectContext = appDelegate.managedObjectContext! 
     let fetchRequest:NSFetchRequest = NSFetchRequest(entityName: "PictureNote") 
     var error:NSError? 
     var result = context.executeFetchRequest(fetchRequest, error: &error) as [PictureNote] 

     for res in result { 
      println(res.latitude) 
      println(res.longitude) 
      println(res.longDate) 
      println(res.month) 
      println(res.year) 
      println(res.text) 
      pictures.append(res.thumbnail) 
     } 

    } 

// Здесь код для отображения в целях сбора

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

     let myImageCell:ImageCell = myCollectionView.dequeueReusableCellWithReuseIdentifier("imageCell", forIndexPath: indexPath) as ImageCell 
     myImageCell.imageCell.image = self.loadImageFromPath(fileInDocumentsDirectory(self.pictures[indexPath.row])) 
     return myImageCell 
    } 

// Здесь код для загрузки изображения с диска

func loadImageFromPath(path: String) -> UIImage { 
    let image = UIImage(contentsOfFile: path) 
    if image == nil { 
     self.newAlert("Error loading your image, try again", title: "Notice") 
    } 
    return image! 
} 

// Вот моя экономия код

func saveNewEntry() { 
     var unique = NSUUID().UUIDString 
     var imageTitle = "Picture\(unique).jpg" 
     var image = self.pickedImageView.image 
     var path = fileInDocumentsDirectory(imageTitle) 
     var thumbImageTitle = "ThumbPicture\(unique).jpg" 
     var thumbPath = fileInDocumentsDirectory(thumbImageTitle) 
     if self.saveImage(image!, path: path) == true && self.saveThumbImage(image!, thumbPath: thumbPath) == true { 
      // Create the saving context 
      let context = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext! 
      let entityOne = NSEntityDescription.entityForName("PictureNote", inManagedObjectContext: context) 
      let thisTask = PictureNote(entity: entityOne!, insertIntoManagedObjectContext: context) 
      // Get all the values here 
      self.getMyLocation() 
      var theDate = NSDate() 
      thisTask.month = Date.toString(date: theDate, format: "MM") 
      thisTask.year = Date.toString(date: theDate, format: "yyyy") 
      thisTask.longDate = theDate 
      thisTask.longitude = getMyLocation()[1] 
      thisTask.latitude = getMyLocation()[0] 
      thisTask.text = self.noteTextView.text 
      thisTask.imageURL = imageTitle 
      thisTask.thumbnail = thumbImageTitle 
      thisTask.id = unique 
      // Saving to CoreData 
      if context.save(nil) { 
       self.newAlert("Saving your note was successful!", title: "Notice") 
       self.noteTextView.text = "" 
      } else { 
       self.newAlert("Error saving your note, try again", title: "Notice") 
      } 

     } else { 

      self.newAlert("Error saving your image, try again", title: "Notice") 
     } 


     self.pickedImageView.image = UIImage(named: "P1000342.jpg") 
    } 

Я очень благодарен за каждое предложение .... если вам нужно больше кода, просто дайте мне знать ...

+0

Это не предупреждение о памяти, это ядро ​​Apple, которое вызывает эту проблему, эта проблема произошла некоторое время назад, возможно, вы можете попробовать обновить свой Xcode и SDK. – CarmeloS

+0

поиск "XPCErrorDescription" для получения дополнительной информации. – CarmeloS

+0

Я знаю это, но я также получаю предупреждение о памяти, которое я не понимаю, это в тексте ... –

ответ

2

Я заметил, что вы используете резко сниженный коэффициент качества в сочетании с UIImageJPEGRepresentation. Если это попытка уменьшить задействованную память, все, что делает, уменьшает размер получаемой записи в постоянном хранилище, но загрузка этого изображения в изображение будет по-прежнему требовать что-то порядка (4 × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × высота) байтов (обратите внимание, что это размеры изображения, а не изображение). Таким образом, изображение 3264 × 2448 с iPhone занимает 30 мб на изображение, независимо от коэффициента качества, используемого UIImageJPEGRepresentation.

Обычно я буду следить за тем, чтобы в моей коллекции/табличном представлении отображалось изображение миниатюр (либо свойство thumbnailALAsset, либо resize the default representation). Если я кэширую этот значок в любом месте (например, постоянное хранилище, предлагаемое вашим вопросом), я могу использовать высококачественное представление миниатюры (я использую PNG, потому что он без потерь сжат, но JPEG с коэффициентом качества 0.7-0.9 - это разумно верная версия тоже).

Смежные вопросы