【问题标题】:Access GCDAsyncSocket read queue访问 GCDAsyncSocket 读取队列
【发布时间】:2014-10-09 02:22:47
【问题描述】:

我正在为我的 iOS 消息传递应用程序使用 GCDAsyncSocket 库,并在后端使用 Twisted Server。一切都设置好并且工作正常,但是当它不能正常工作时,我发现了一个特殊的情况。因此,我的服务器的架构方式是,当用户离线时,他的所有消息都缓存在服务器上,当检测到他在线时,服务器会立即将所有缓存的待处理消息发送给他。

现在,GCDAsyncSocket 使用内部读取和写入队列,所以在这里,那些由服务器发送的待处理消息被读取队列排队,直到它们被委托方法 -(void)socket:didReadData:withTag: 读取现在,在我的应用程序中,这个委托方法处理传入的消息并在表格视图中一一显示。因此,问题的关键在于,每当委托方法从队列中读取时,如果您暂停应用程序,读取队列中所有未处理的消息都会丢失。因此,为了解决这个问题,我想访问读取队列,以便在应用暂停之前保存其内容,以便在再次打开应用时恢复它。

注意:根据我的理解,丢失的消息来自队列而不是服务器,因为服务器显示“发送的所有消息”甚至在代理在处理时达到一半消息之前。之后,如果暂停,则此问题仍然存在。

那我做错了吗?或者有什么办法可以访问队列?

【问题讨论】:

    标签: ios twisted gcdasyncsocket


    【解决方案1】:

    您可以考虑在您的协议中添加一个确认步骤。与其让服务器发送所有排队的消息然后立即忘记它们,不如让它记住它们,直到客户端发回每条消息的确认。

    这样,无论客户端在接收特定消息和将其显示给用户之间做什么,该消息将始终可用于从服务器重新传递。只有在客户端查看(并因此确认)消息后,服务器才会忘记它(因此不会在下次客户端出现时将其重新传输给客户端)。

    您可以通过为消息分配唯一标识符来轻松完成此操作。这些可能是随机的 UUID,或者 - 如果您的消息传递必须始终按顺序排列 - 序列号。序列号很方便(如果它们对您的应用程序有意义),因为通过确认单个消息序列号,您的客户端可以指示它已经处理了多个消息(因为如果它总是按顺序处理它们,那么任何具有较早序列号的消息都必须具有也被处理了)。

    此策略的失败模式与您当前策略的失败模式相反。现在,当电话在从接收队列中拉出消息之前挂起时,它就会丢失。使用确认,消息在处理(显示)之前不会丢失。但是,您可能会显示该消息,然后以某种方式无法发送确认。这将导致消息显示两次。

    您还可以通过在电话上记录有关已处理(显示)哪些消息的信息来缩小此故障的窗口。如果电话从服务器接收到一条消息,它知道它已经显示,那么它可以跳过显示它并重新发送确认以允许服务器忘记它。

    这会将失败窗口缩短到仅显示消息与您设法在本地记录该消息已显示之间的时间(或相反的顺序,如果您更喜欢消息丢失的失败模式,而不是它们显示两次)。

    【讨论】:

    • 感谢 Jean-Paul 的解决方法。实际上,我已经实现了一些接近于此的东西,目前我的原型正在使用它本身。我正在做的是每次成功接收到待处理消息时从我的应用程序发送一个“getnext”信号。这个“getnext”信号检索在服务器队列中排队的下一条消息。如果队列用尽,服务器会发送“empty”。每当客户端收到“empty”时,它就会停止发送“getnext”信号。
    • 现在,这非常有效,但我的应用程序的性质略有不同(我不能随意透露)。我能说的是它需要非常快的数据。经过多次测试,当我将服务器托管在 Internet 上时,上述解决方法被证明很慢(在 localhost 上开发期间,由于显而易见的原因,它运行得很快)。所以,我认为,事实证明,每条待处理消息的来回消息非常慢,这就是为什么我需要一次发送所有消息的原因。因此,如果有办法访问读取队列,我可以保存它。
    • 我真的希望我能根据您提供的精彩解释将您的答案标记为正确,但我认为这个问题更多的是客户端而不是服务器端。无论如何,谢谢。
    • @Jean-Paul Calderone,总是有一个很好的答案,在这里或在邮件列表中。你得到了我的尊重。我仍然记得你在记录列表上给我的第一个答案, 美好时光;)
    • 谢谢@brunsgaard :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多