2016-10-24 7 views
0

그래서 나는 여기에서 혼합 된 축복을 발견했습니다. 내 앱이 예상보다 빠르게 성장하고 있으며 성능이 저하되기 시작했습니다. 소셜 미디어이며 사용자 데이터는 Firebase에 저장됩니다. viewDidLoad에서 사용자 데이터를 Table View로 파싱했습니다. 필자는 Firebase에서 장치로로드해야하는 수백 개의 레코드를 가지고 있으며, 이제 테이블 뷰 (100)에 표시되는 사용자 수를 제한하려고합니다.신속하게 어레이 용량을 제한하는 것이 더 효율적입니까?

내 질문에 :
더 나은 성능 옵션은 무엇입니까? 단순히 numberOfRowsInSection을 100으로 제한하면됩니까? 또는 인덱스 100 이후에 사용자 배열의 모든 요소를 ​​제거 하시겠습니까?

두 번째 옵션 인 경우 어떻게해야합니까? 불행히도 배열을 처음부터 정렬 할 수 있도록 배열에 저장된 사용자 데이터가 필요하지만 정렬 후에는 특정 인덱스 뒤에 배열의 모든 요소를 ​​제거하고 싶습니다. (나는 이상하게 보입니다, 나중에 코드를 수정하고 더 매끄럽게 만들 것입니다).

감사합니다.

+2

어떤 성능 문제가 있습니까? 계측기에서 앱의 프로파일을 작성하여 문제가 발생한 정확한 위치를 파악 했습니까? 'UITableView'는 테이블의 행 수가 대부분의 경우 성능에 큰 영향을 미치지 않도록 최적화되어 있습니다. – dan

답변

3

이 문제는 서버 측에서 처리하는 것이 가장 좋습니다. 따라서 사용자 데이터에 대한 끝점을 호출하면 정렬을 처리하고 최대 100 개의 항목 만 반환합니다.

두 가지 옵션 중 하나만 선택하고 싶지 않은 경우 정렬 후 필요하지 않으면 요소를 100 개 삭제하는 것이 좋습니다. 이렇게하면 각 개체의 크기에 따라 다소 많은 양의 메모리를 확보 할 수 있습니다. 쉽게 100 후 항목을 제거하려면이를 사용할 수 있습니다

일반적으로
myArray.removeRange(100..<myArray.count) 
+1

그래, 지금 당장은 이것이 나에게 가장 적합하다. 나중에 서버 쪽을 고칠 예정이지만, 지금 당장 필요한 코드가 있습니다. 임의로 고마워. –

1

당신이있는 tableview 또는 항목의 임의의 수의 값 비싼 데이터 저장소의 어떤 종류의 지원을받습니다 콜렉션 뷰있을 때마다, 말하기의 여부를 데이터베이스 또는 REST 호출 또는 다른 무엇이라도로드를 매김하고 사용자가 스크롤 할 때 더 많은 레코드를 얻고 싶다. 예를 들어 페이 스북 피드에 갈 때 페이스 북 게시물을 모두로드하고 싶지는 않습니다. 가장 최근의 피드 항목 만로드되며보기 컨트롤러를 스크롤 할 때 서버에 추가 데이터를 요청하므로 무기한 스크롤 할 수 있습니다.

func refresh() { 
     if isLoading == false { 
      isEndOfData = false 
      currentPage = 0 
      loadPage(currentPage) 
     } 
    } 

    func loadPage(_ page: Int) { 
     isLoading = true 
     Notification.getPage(currentPage, pageSize: pageSize) { error, notifications in 
     //Handle API call here 
     } 
    } 

    func loadNextPage() { 
     if isLoading == false && isEndOfData == false { 
      currentPage += 1 
      loadPage(currentPage) 
     } 
    } 

    //MARK: UIScrollViewDelegate 
    extension NotificationViewController: UIScrollViewDelegate { 
     func scrollViewDidScroll(_ scrollView: UIScrollView) { 
      let currentOffset = scrollView.contentOffset.y 
      let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height 
      if (maximumOffset - currentOffset) <= GlobalConstants.paginationScrollOffset { 
       loadNextPage() 
      } 
     } 
    } 
관련 문제