2014-11-27 2 views
1

구문 분석에서 유래 한 후 Ui를 수용하기 위해 TableViewData 소스 메서드를 호출하려고합니다. 이것으로 나는 이미지를 표시하려고 loaditem에 그런 다음이메서드 완료 후 TableViewDataSource로드하기

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    println("in table view") 
    println(self.imageResources.count) 
    return imageResources.count+1; 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell:CustomTableViewCell = tableView.dequeueReusableCellWithIdentifier("customCell") as CustomTableViewCell 

    var (title, image) = items[indexPath.row] 

    cell.loadItem(title: title, image: image) 


    println("message : going upto this line") 
    println(self.imageResources.count) 


    var (image1) = imageResources[indexPath.row] 

    cell.loadItem1(image1: image1) 

return cell 
} 

같이있는 tableview에이 가져온 데이터를 채울 수

func loadImages() { 

    var query = PFQuery(className: "TestClass") 
    query.orderByDescending("objectId") 


    query.findObjectsInBackgroundWithBlock ({(objects:[AnyObject]!, error: NSError!) in 
     if(error == nil){ 

      self.getImageData(objects as [PFObject]) 

     } 
     else{ 
      println("Error in retrieving \(error)") 
     } 

    })//findObjectsInBackgroundWithblock - end 


} 

func getImageData(objects: [PFObject]) { 

    for object in objects { 

     let thumbNail = object["image"] as PFFile 

     println(thumbNail) 

     thumbNail.getDataInBackgroundWithBlock({ 
      (imageData: NSData!, error: NSError!) -> Void in 
      if (error == nil) { 
       var imageDic = NSMutableArray() 
       self.image1 = UIImage(data:imageData) 
       //image object implementation 
       self.imageResources.append(self.image1!) 


       println(self.image1) 

       println(self.imageResources.count) 


      } 
      }, progressBlock: {(percentDone: CInt)-> Void in 

     })//getDataInBackgroundWithBlock - end 



    }//for - end 


    self.tableView.reloadData() 

하지만하지를 가져올 수 있어요 그리고 난 내 자신을 writen있다 배열을 이미지 배열 채울 수 있지만 채울 때 제로 값 geeting 그래서 그것을 설정할 수 없습니다.

어떤 도움을 많이 주시면 감사하겠습니다!

+0

컨트롤러에 tableview의 대리자/데이터 소스를 연결 했습니까? 즉, self.tableview.delegate = self; self.tableview.datasource = 자기; ? – Suresh

+0

죄송합니다.하지만 실제로 나는 초보자로서 m을 얻는 데 아벨이 아니므로 안심하고 받으실 수 없으므로 이것에 관해 더 자세한 정보를 제공해주십시오. – user3519641

+0

이 링크를 보시오. https://gist.github.com/watert/13c38d269ea15aa8360f – Suresh

답변

0

로드 밸런싱은 백그라운드에서 병렬로 발생하는 동시성과 관련된 몇 가지 문제가 있습니다.

첫번째 문제는 로딩 프로세스에서 임시 변수로 self.image1을 사용하는 것입니다.이 변수는 여러 스레드가 동시에 액세스 할 수 있습니다. 이를 위해서는 지역 변수를 사용해야합니다.

둘째, 복수 스레드에서 self.imageResources에 추가 중이지만 스위프트 배열은 스레드로부터 안전하지 않습니다.

셋째, 모든 데이터를로드 한 후에 tableview에서 reload를 호출해야합니다.이 작업은 백그라운드 작업이 진행되는 동안 호출하기 때문에 지금 일어나지 않습니다.

마지막으로 사용자의 getImageData 함수가 백그라운드 큐에서 실행 중이며 기본 큐에서 UI 다시 작업 (예 : 테이블 다시로드)을 수행해야합니다.

가장 간단한 방법은 동기 호출에 도착 썸네일 로딩을 변경하는 것입니다 - 이것은 미리보기 이미지를 순차적으로로드 것을 의미 길어질 여러 병렬 작업 것을 할 수 있지만 쉽게 관리 할 수 ​​-

func getImageData(objects: [PFObject]) { 

    for object in objects { 

     let thumbNail = object["image"] as PFFile 

     println(thumbNail) 

     let imageData? = thumbNail.getData 
     if (imageData != nil) { 
       let image1 = UIImage(data:imageData!) 
       //image object implementation 
       self.imageResources.append(image1!) 

       println(self.imageResources.count) 
     } 

    }//for - end 

    dispatch_async(dispatch_get_main_queue(), { 
     self.tableView.reloadData() 
    }) 
} 

더 복잡한 방법은 디스패치 그룹을 사용하고 병렬 이미지로드를 유지하는 것입니다. 이 작업을 수행하려면 공유 배열에 대한 액세스를 보호해야합니다.

+0

당신이 제안한 코드는 똑같지 만 내 경우에는 효과가없는 것 같다. – user3519641

+0

'loadItem'과'loadItem1'의 코드는 무엇인가? 귀하의 사용자 정의 셀 클래스? 귀하의 질문에 그것을 추가 할 수 있습니까? 지금 로그에 뭐가 들었 니? – Paulw11

+0

또한 numberOfRowsInSection에서 return count + 1을 사용하는 이유는 무엇입니까? 테이블 함수가 호출되고 있음을 확인하기 위해 중단 점을 설정 했습니까? – Paulw11

관련 문제