2017-10-12 39 views
1

我是新来的iOS开发和我目前的应用程序,我需要做到以下几点:斯威夫特。如何动态地划分结果为几个部分

  • 得到结果来自Flickr搜索(完成)
  • 结果写入阵列由10个项目(不能弄清楚如何)
  • 10项

所以填充在收集查看结果,这是我有:

@IBOutlet weak var start_btn: UIButton! 
fileprivate var searches = [FlickrSearchResults]() 
fileprivate let flickr = Flickr() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    flickr.searchFlickrForTerm("cat") { 
     results, error in 

     if let results = results { 
      print("Found \(results.searchResults.count) matching \(results.searchTerm)") 
      self.searches.insert(results, at: 0) 

因此,而不是最后一行我想将结果(有500条记录)分成10个批次,以便以后我可以按批次从搜索数组中获取它们。

你能告诉我这是一个好主意吗?如何实现它?

+1

是你只是试图做分页? - 一次显示10个结果页面? – Wez

+0

是的,确切地说。有没有更简单的方法来实现这一点? –

+0

以下任何解决方案都应该可以工作,您只需修改它们即可使用您的搜索数组。 – Wez

回答

2

我不认为这是个好主意。要稍后拆分阵列,可以使用两个变量 - startIndexendIndex。例如,如果你想从0只显示记录 - 9项指标,写类似:

startIndex = 0 
endIndex = 9 

let resultsBatch = results[startIndex...endIndex] 
+0

谢谢你的想法!你能帮我弄清楚如何在循环中用resultBatches填充数组搜索? –

0

可以中创建具有数组列表里的数组做到这一点。请在以下示例代码:

@IBOutlet weak var start_btn: UIButton! 
// Make a array list which can store arrays of FlickrSearchResults 
fileprivate var searches = [[FlickrSearchResults]]() 
fileprivate let flickr = Flickr() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    flickr.searchFlickrForTerm("cat") { 
     results, error in 

     // Prepare some section/counter/insideArray varaibles to split your values 
     var section = 0 
     var counter = 0 
     var insideArray = [FlickrSearchResults]() 

     if let result = results { 
      if counter < 9 { 
       // Fill the inside array list, if we reach 10 values, they will be stored in your searches array list 
       insideArray.append(result) 
       if result == results.last { 
        // If you identify the end of your values 
        searches.insert(insideArray, at: section) 
        continue 
       } 
       counter = counter + 1 
      } else { 
       // Store the first 10 values in your array list section [0], then the next 10 values in section[1], etc. 
       insideArray.append(ar) 
       searches.insert(insideArray, at: section) 
       counter = 0 
       section = section + 1 
       insideArray = [] 
      } 
     } 
    } 
} 
+0

嗨,谢谢。事情是,结果是不是一个数组,它不允许数组方法 –

+0

不,它不是...但你可以iterare结果,并将其放置到一个数组... – AlexWoe89

2

下面是一个简单迅捷4扩展Array到块阵列。

extension Array { 
    func chunked(by size: Int) -> [[Element]] { 
     return stride(from: 0, to: count, by: size).map { index in 
      Array(self[index..<Swift.min(index + size, count)]) 
     } 
    } 
} 

在你的代码,你将要存储所有结果,那么只能说明你感兴趣的页面

@IBOutlet weak var start_btn: UIButton! 
fileprivate var chunkedResults = [[FlickrPhoto]]() 
fileprivate var searches = [FlickrPhoto]() 
fileprivate let flickr = Flickr() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    flickr.searchFlickrForTerm("cat") { results, error in 
     if let results = results { 
      print("Found \(results.searchResults.count) matching \(results.searchTerm)") 
      self.chunkedResults = results.searchResults.chunked(size: 10) 
      self.searches = self.chunkedResults.first ?? [] 
+0

我真的很喜欢这种方法,问题是,结果'不是一个数组,不能被chanked。我可以查找搜索吗? –

+0

@ToursdayFourAM它看起来像你需要挖掘结果来获得'FlickrPhoto'数组。 –

0

也许这将是有益的。

let resultsCount = 505 
    let batchSize = 10 

    var startIndex = 0 
    var endIndex = 0 

    let batchesCount = Int(results.count/batchSize) 
    let batchRest = results.count % batchSize 

    var batches: [[Int]] = [] 

    for batch in 0..<batchesCount { 
     startIndex = batch * batchSize 
     endIndex = startIndex + batchSize 

     batches.append(Array(results[startIndex...endIndex])) 
    } 

    let lastBatch = Array(results[endIndex..<endIndex + batchRest]) 
    batches.append(lastBatch) 

    print(batches)