2016-11-22 2 views
2

뉴스 피드 역할을하는 tableview가 있습니다. 셀은 뉴스 피드 항목의 배열에서 채워집니다. 서버에서 JSON을 가져 와서 해당 입력에서 뉴스 피드 항목을 만들고이를 내 뉴스 피드 배열에 첨부합니다. 뉴스 피드 항목에는 제목, 설명 및 이미지 끈 문자열이 포함됩니다.swift 3 iOS tableview 데이터 소스 메모리

은시 :

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    var cell = tableView.dequeueReusableCell(withIdentifier: "ImageFeedItemTableViewCell1", for: indexPath) as! ImageFeedItemTableViewCell 
    var item = self.feed!.items[indexPath.row] 
    if (item.messageType == 1){ 
    cell = tableView.dequeueReusableCell(withIdentifier: "ImageFeedItemTableViewCell1", for: indexPath) as! ImageFeedItemTableViewCell 
    cell.title.text = item.title 
    cell.description.text = item.contentText 

    if (item.imageURL as URL == URL(string: "noPicture")!) 
    { 
     cell.picture.image = UIImage(named:"empty") 
    } 
    else{ 

    if (item.cachedImage == UIImage(named:"default-placeholder")){ 
    let request = URLRequest(url: item.imageURL as URL) 
    cell.picture.image = item.cachedImage 
    cell.dataTask = self.urlSession.dataTask(with: request, completionHandler: { (data, response, error) -> Void in 
     OperationQueue.main.addOperation({() -> Void in 
      if error == nil && data != nil { 
       let image = UIImage(data: data!) 
       if (image != nil){ 
       self.feed!.items[indexPath.row].cachedImage = image! 
       } 
       cell.picture.image = image 


      } 

     }) 

    }) 
     cell.dataTask?.resume() 
    }else 
    { 
     cell.picture.image = item.cachedImage 
    } 
    } 


} 

행에서 세포 내 newsfeeditem 데이터로 가득 얻을.

하지만 내 모든 뉴스 피드 항목을 배열 안에 보관하므로 메모리 사용량이 높고 각 추가 뉴스 피드에 대한 gehts가 더 높습니다. 트위터처럼 끝없이 스크롤되도록 노력하겠습니다. 경험 많은 개발자가이 메모리 문제를 해결하는 방법에 대해 궁금합니다.

+2

의 코드 내가 누락 된 코드를 추가 한 –

+0

로 cellForRowAt 방법을 추가하십시오! –

+1

페이지 매김을 구현하는 것이 좋습니다. 어떤 종류의 페이지 매김? 페이지 인덱스 번호가 오래된 것 같습니다. 그래서 트위터에 대해 생각해 보았습니다. 하단에 도달하면 새로운 트윗을로드하지만로드하지 않고 다시 스크롤 할 수 있습니다. 즉, 데이터를 어딘가에 저장하고 메모리에있는 모든 트윗을 유지하는 것이 내가 추측하는 응용 프로그램을 충돌. – Ccr

답변

1

배열에 UIImage을 보유하려고하면이 라인에있는 문제가 발생합니다. 이는 실제로 권장되지 않으며 이미지가 매우 크기 때문에 RAM에 균열이 발생할 수 있으므로 UIImage으로 RAM에 유지하도록 권장하지 않습니다. 내부 배열 :

당신은 기본적으로 후 URL에서 이미지를 가져하기 만하면 무엇

self.feed!.items[indexPath.row].cachedImage = image!

, 당신은 앱의 문서 폴더에 저장하고 이름을 저장하거나이 cachedImage에 해당 할 수있는 별개의 이미지 (단지 경로입니다 유형을 문자열 또는 sth로 변경)을 표시해야 할 때 앱의 문서 폴더에서 다시 가져옵니다. cellForRow

흐름 : 이미지를 가져 오기 -> 디스크에 저장하고 배열에 경로를 지속 -> 다시 반입을 디스크에서 경로 cellForRow

+1

좋아, SDWebImage를 사용하여 그 동작에 도달 할 수 있다고 들었는데, 맞습니까? 그러나 만약 내가 셀 안의 이미지를 가지지 않는다면, 텍스트는 뉴스 피드 아이템으로도 증가 할 것인가? –

+1

네,'SDWebImage'는 작은 코드로 위의 모든 단계를 수행하는 데 도움이 될 것입니다 – Tj3n

+0

대답하기 전에 잠깐 대답을 편집했습니다. 죄송합니다 –