【问题标题】:split NSArray in groups of smaller NSArrays for paging将 NSArray 拆分为一组较小的 NSArray 以进行分页
【发布时间】:2011-07-29 00:05:07
【问题描述】:

我有一个 NSArray 说 100 个 NSManagedObjects,我需要将其拆分为一个 NSArray,其中包含 10 个 NSArray 对象,每个对象包含 10 个 NSManagedObjects,我将如何实现?

我要进行一些寻呼,这对我来说效果很好。

【问题讨论】:

  • 假设你只是想传入一个数组并且每次都有相同的代码工作,为什么不只是传递一个长度为 10 和位置 [无论哪个] 的 NSRange 以及原始未修改的 NSArray,并让页面代码基于 NSRange,而不是绝对索引?
  • 听起来很完美——我该如何做到这一点?
  • 这几乎与stackoverflow.com/questions/6852012/… 完全相同。答案是重复使用subArrayWithRange:,并改变范围。

标签: iphone objective-c ipad


【解决方案1】:

你是怎么得到这些NSManagedObjects的?如果您使用的是NSFetchRequest,您可能希望保留它,并且一次只能从中获得 10 个结果。

【讨论】:

    【解决方案2】:

    这是我的代码:

    [object splitArrayWithArray:arrayWith100Objects rangeNumber:10];

    - (NSArray*) splitArrayWithArray:(NSArray*)rawArray rangeNumber:(int)rangeNumber{
        int totalCount = rawArray.count;
        int currentIndex = 0;
    
        NSMutableArray* splitArray = [NSMutableArray array];
    
        while (currentIndex<totalCount) {
            NSRange range = NSMakeRange(currentIndex, MIN(rangeNumber, totalCount-currentIndex));
            NSArray* subArray = [rawArray subarrayWithRange:range];
            [splitArray addObject:subArray];
            currentIndex +=rangeNumber;
        }
        return splitArray;
    }
    

    【讨论】:

      【解决方案3】:

      按照这些思路应该可以工作,而不是将其分解为单独的数组

      //make a new range for each page
      NSRange myRange = NSMakeRange(10, 10);
      NSArray * myArray = [NSArray array];
      
      //...pass both into a function
      for (int i = myRange.location; i < myRange.location + myRange.length; i++) {
          //stuff with the array elements
          [[myArray objectAtIndex:i] doSomething];
      }
      

      【讨论】:

        【解决方案4】:

        它不是单行的,但这会将数组拆分为页面:

        NSArray *arrayToSplit = ...
        
        int pageSize = 50;
        NSMutableArray *arrayOfPages = [NSMutableArray new];
        
        NSRange range = NSMakeRange(0, pageSize);
        
        while (range.location < arrayToSplit.count) {
            if (range.location + range.length >= arrayToSplit.count)
                range.length = arrayToSplit.count - range.location;
        
            [arrayOfPages addObject:[arrayToSplit objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range]]];
        
            range.location += range.length;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多