2017-08-09 209 views
0

用户向其包中添加项目。只要将商品添加到包中,我们就会进行网络通话以确保该商品仍然可用。网络通话需要几秒钟才能在后台完成。获取topVC或Visible VC并检查特定VC是否在堆栈中

当一个项目被添加到购物车时,它被存储在一个可以从应用程序的任何地方访问的单例中。就像这样:

static let shared = Cart()  
var products = [Product]() 

当网络调用返回和产品是不可用的,我们从单中删除。如果购物车VC在网络呼叫期间打开,则会导致问题,因为表视图需要重新加载。出于这个原因,我们需要检查可见的VC是否是购物车VC并重新加载表格视图。我还想检查CartVC是否在内存中并重新加载表格视图。因为如果购物车VC在内存中并且低于另一个VC,那么它也将具有不良数据,并且当用户关闭VC时,它们将看到不好的数据。我会怎么做?

在此标记为重复项目之前,我没有检查其他帖子,没有一项效果很好。还有很多方法可以做到这一点,我想知道哪些是最快的3.

回答

0

当购物车停在堆栈中时,请使用viewWillAppear然后重新载入表格。这样你就不会重新加载表格所需的次数。 (如果购物车处于堆叠状态,并且有四个不同的网络呼叫返回,则仅在其出现之前将其重新加载,而不是在隐藏时将其重新加载四次。)通常在viewWillAppear中重新加载表视图,专门用于处理潜在的过时数据。

因为当车出现在屏幕上的情况下,你单身,每当一个产品回来为不可用,车可以viewWillAppear该通知登记和viewWillDisappear(或viewDidDisappear)注销可以发送通知。通知可以触发完整的数据重新加载,也可以包含哪些产品不可用,并让用户知道发生了什么(而不是突然从购物车中消失,但没有解释)。

这样,单例不需要知道任何有关购物车视图控制器的信息,从而使其更具可重用性。

+0

为什么我们需要注销通知。这有效,但我们不会在应用程序的任何位置注销我们的通知。这真的很糟糕吗?所有的通知都在告诉VC重新加载表格视图 –

+0

这并不算太坏。通过注销通知时,它不是可见的VC保持表视图不必要的重新加载。如果你保持注册风险投资的生命,那么你不需要在'viewWillAppear'中重新加载表格,但是如果你有很多项目在同一时间回到无法使用的状态,那么你可能会看到一个看不见的表现视图一遍又一遍地重新加载。还要确保通知中的重新调用正在主线程中发生,否则会发生奇怪的事情。 – theMikeSwan

+0

完美。谢谢。我们正在重新加载视图反正会出现,所以问题甚至不是问题。我只是没有意识到这一点。我们如何在viewwilldispapear上取消注册通知? –

1

您可以使用通知来做到这一点。想象一下这个项目不再可用并且VC处于打开状态的情况:

1 - 订阅诸如“ItemNotAvailableNotification”之类的通知。

2 - 网络调用返回,该项目不再可用。

3 - 发布通知“ItemNotAvailableNotification”。

4 - 在你的VC处理通知。

此外,此方法允许您处理“CartVC”和您的“PreviousVC”中用户导致相信该项目可用的“坏数据”。