调用异步进程的Swift闭包重复连接返回值

时间:2017-11-01 05:40:29

标签: swift asynchronous closures

我有一个循环遍历项目集合的进程。对于每个项目,它执行异步调用,该调用传入由子异步调用填充的数组。返回的数组应具有与集合中每个项相关的值。发生的事情是数组最终填充了重复项,如下所示: ([集合1的值],[集合1的值] [集合2的值],[集合1的值] [集合2的值],[集合3的值])

解释相当混乱。在现实世界中,这是收集播客,并为每个播客收集所有剧集,并为每一集检查是否在某个特定日期之后,然后采取行动。

以下是代码:

for collection in podcastCollections {
           //loop through all episodes for collection
          dispatchGroup.enter()
            let _ = localNetworkLookup.getEpisodesFromFeedURL(urlParam: collection.feedUrl) { (returnedItems)  in
               //bug is that returnedItems is just appended to in each call, it does not start fresh for each collection
               for item in returnedItems {
                   if item.feedPubDate! >= collection.dateLastRefresh! {
                          newEpisode = PodcastEpisode(feedTitle: item.feedTitle!, feedLink: "", feedContent: item.feedContent!)                       
                         //this is the issue here- it loads the same episodes repeatedly, because they stick around in returnedItems
                         //but I expect returnedItems to only have items for the collection that is currently in the loop
                         triageEpisodes.append(newEpisode!)
                         print ("added \(newEpisode!.feedTitle)")
                   }//if  pub date
                 }//for items
              }//localNetworkLookup.getEpisodesFromFeedURL
           dispatchGroup.leave()
        }//for collection
        dispatchGroup.notify(queue: DispatchQueue.main) {

            print (triageEpisodes.count)


        }//dispatch group notify

之前我曾使用过闭包和异步内容,但从未处理过这样的循环。在此先感谢您的帮助,我完全被难过了。

我的问题是 - 如何让输出反映每个播客的剧集而不重复。目前,每个循环都包含先前网络呼叫的内容。当前输出如下所示:

补充#1743:谢尔曼LeTank 添加#1742:诺贝尔润滑脂奖

现在重复*

补充#1743:谢尔曼LeTank 添加#1742:诺贝尔润滑脂奖 增加了对巴布拉广场的访问 伯尼桑德斯认为民主党人仍然偏离正轨

现在重复*

补充#1743:谢尔曼LeTank 添加#1742:诺贝尔润滑脂奖 增加了对巴布拉广场的访问 伯尼桑德斯认为民主党人仍然偏离正轨 添加#167 - 死亡设计 添加了#166 - Geez。我不知道 添加了#CLXV - 提升权限 添加#164 - 奔向梦想 添加#1743:谢尔曼LeTank 添加#1742:诺贝尔润滑脂奖 增加了对巴布拉广场的访问 伯尼桑德斯认为民主党人仍然偏离正轨 添加#167 - 死亡设计 添加了#166 - Geez。我不知道 添加了#CLXV - 提升权限 添加#164 - 奔向梦想 将Dr. Seuss放在沙发上

修改 所以事实证明这种情况发生的原因是因为闭包在整个循环周期的范围内。这意味着闭包使用的变量也保留在作用域中,因此无法从循环内部隔离任何特定调用中返回的值。我的修复是在循环之外创建一个新数组,并且在循环的迭代中将新数组设置为闭包返回的数组。循环的最后一次运行将以完全填充的数组结束。但是没有办法在循环内对闭包结果进行任何处理。

0 个答案:

没有答案