IKEventSourceHirro 2.1.6

IKEventSourceHirro 2.1.6

测试已测试
语言语言 SwiftSwift
许可证 自定义
发布最后发布2017年4月
SwiftSwift 版本3.0
SPM支持 SPM

Jim Arnell维护。




EventSource

EventSource

使用 NSURLSession 编写的 Swift 的 SSE 客户端。

摘要

这是一个尝试将 API 尽可能保持与 JavaScript 相似的 Swift 编写的 EventSource 实现。基于W3C EventSource 编写。如果有遗漏或不完全正确的地方,请提出问题,我会处理它!

如何使用它?

它与 JavaScript 版本的功能一样,主要区别在于创建新的 EventSource 对象时,您可以添加请求头,例如,如果您的服务器使用基本认证,您可以在那里添加头。

Last-Event-Id 由库完全处理,因此如果连接断开需要重新连接时,它会发送到服务器。此外,Last-Event-Id 存储在 NSUserDefaults 中,因此我们可以保存最后接收的事件,以便下次使用应用程序时避免接收重复的事件。

如果连接断开,库会自动重新连接。重新连接时间为 3 秒。此时间可以通过服务器发送的 retry: time-in-milliseconds 事件来更改。

您还可以在 sse-server 文件夹中找到一个非常简单的 node.js 服务器来测试库。要运行服务器,只需

  • npm install
  • node sse.js

安装

您可以直接将 EventSource.swift 文件拖放到项目中或使用 CocoaPods。

pod 'IKEventSource'

然后导入库

import IKEventSource

JavaScript API

var eventSource = new EventSource(server);

eventSource.onopen = function() {
    // When opened
}

eventSource.onerror = function() {
    // When errors
}

eventSource.onmessage = function(e) {  
    // Here you get an event without event name!
}

eventSource.addEventListener("ping", function(e) {
  // Here you get an event 'event-name'
}, false);

eventSource.close();

Swift API

var eventSource: EventSource = EventSource(url: server, headers: ["Authorization" : basicAuthAuthorization])
   
eventSource.onOpen {
  // When opened
}
        
eventSource.onError { (error) in
  // When errors
}

eventSource.onMessage { (id, event, data) in
  // Here you get an event without event name!
}
   
eventSource.addEventListener("event-name") { (id, event, data) in
  // Here you get an event 'event-name'
}

eventSource.close()

我们添加了以下方法,这些方法在 JavaScript EventSource API 中不可用,但我们认为它们可能很有用

public func removeEventListener(event: String) -> Void
public func events() -> Array<String>

以下属性也可用

  • readyState:EventSource 的状态
    • EventSourceState.Closed
    • EventSourceState.Connecting
    • EventSourceState.Open

  • URL:EventSource 服务器 URL。

示例


事件:

id: event-id
event: event-name
data: event-data

调用

eventSource.addEventListener(event-name) { (id, event, data) in
  // Here you get an event 'event-name'
}

事件:

id: event-id
data: event-data
data: event-data

调用

eventSource.onMessage { (id, event, data) in
  // Here you get an event without event name!
}

事件:

id: event-id
data: event-data-1
data: event-data-2
data: event-data-3

调用

eventSource.onMessage { (id, event, data) in
  // Here you get an event without event name!
  // data: event-data-1\nevent-data-2\nevent-data-3
}

事件:

:heartbeat

调用

nothing it's a comment

实时示例

这是应用程序附带的示例。如果您运行服务器和应用程序,您将能够看到这个示例的实时效果。移动的箱子的作用只是展示所有功能均可后台运行,主线程性能没有下降。(GIF 图像看起来不太好,但如果你点击图片,你会转到运行更加顺滑的 gfycat 版本)

Sample

贡献者

感谢所有贡献者指出丢失的内容或问题,并修复这些问题或提出问题!!

联系方式

关于使用本库的任何< Kittchen>疑问或< strong>一般性评论,请使用我们的公共 hipchat 房间

如果您在使用本库时发现任何< strong>错误或遇到任何< strong>问题,请在此存储库(或拉取请求 :))中提出问题

您可以在inaka.github.io查看我们的所有开源项目