一面:
1.SDK体积优化
2.webView白屏
3.线上闪退处理流程
4.Runtime、Runloop应用,结合项目;为什么开启runloop
5.MVC MVVM 项目里具体的用法
算法:
1.单链表中是否存在环?如果存在,返回环的起始节点。解释快慢指针原理。
2.一百盏灯排成一行,从左到右编号1-100,每盏灯都有一根开关,一开始全是灭的,另外有100小孩,第一个把1的倍数的开关拉一下,第二个把凡是2的倍数开关拉一下,这样下去到最后一盏灯,有哪些是亮的?(口述思路)
二面:
1.写一个工具方法:用 OC 或 Swift 实现,查找数组的第 k 个大的元素
要求能在项目里实际使用,可以用三方库。注意边界条件。
2.卡片动态化,怎么避免因为卡片样式等接需求
3.IM列表数据过大的问题
4.删除消息怎么保证多端一致性
5.怎么解决ViewModel过大的问题,MVVM和MVC的核心区别是双向绑定吗?
6.为什么选择SSE
7.离线包
8.webView cookie 丢失问题
9.RN长列表性能问题
参考答案
(GPT)
1.SDK体积优化
2.webView白屏
3.线上闪退处理流程
4.Runtime、Runloop应用,结合项目
算法:
1.单链表中是否存在环?如果存在,返回环的起始节点。解释快慢指针原理。
2.一百盏灯排成一行,从左到右编号1-100,每盏灯都有一根开关,一开始全是灭的,另外有100小孩,第一个把1的倍数的开关拉一下,第二个把凡是2的倍数开关拉一下,这样下去到最后一盏灯,有哪些是亮的?(口述思路)
这个问题可以通过分析开关操作的规律来解决。我们来详细探讨一下每盏灯的状态。
问题分析
- 一开始,每盏灯都是灭的。
- 每个小孩操作的是与他们编号相同的倍数的开关。例如,第一个小孩操作的是1、2、3、4、…、100号开关;第二个小孩操作的是2、4、6、8、…、100号开关,依此类推。
观察灯的状态
每盏灯的状态取决于被多少个小孩操作。一个灯的状态会在操作次数(开关次数)为奇数时变为亮,为偶数时保持灭。
我们可以发现:
- 如果灯的编号是 ( n ),那么它会被所有 ( n ) 的因子的小孩操作。比如,灯编号为12的灯会被1、2、3、4、6、12号小孩操作。
- 因此,每盏灯的状态由它的因子数量决定。如果因子数量是奇数,则灯是亮的。如果因子数量是偶数,则灯是灭的。
因子数量的分析
每个正整数 ( n ) 的因子数量通常是偶数,因为因子通常成对出现(比如 ( 1 ) 和 ( n ), ( 2 ) 和 ( n/2 ) 等)。然而,完全平方数(如1, 4, 9, 16, …)的因子数量是奇数,因为一个因子对(如 ( \sqrt{n} ))会被重复计算一次。
结论
- 只有完全平方数的因子数量是奇数,因此只有那些灯编号是完全平方数的灯会在最后亮着。
列出完全平方数
- ( 1^2 = 1 )
- ( 2^2 = 4 )
- ( 3^2 = 9 )
- ( 4^2 = 16 )
- ( 5^2 = 25 )
- ( 6^2 = 36 )
- ( 7^2 = 49 )
- ( 8^2 = 64 )
- ( 9^2 = 81 )
- ( 10^2 = 100 )
所以,最后亮着的灯的编号是:1, 4, 9, 16, 25, 36, 49, 64, 81, 100。
二面:
1.写一个工具方法:用 OC 或 Swift 实现,查找数组的第 k 个大的元素
要求能在项目里实际使用,可以用三方库。注意边界条件。
2.卡片动态化,怎么避免因为卡片样式等接需求
3.IM列表数据过大的问题
4.删除消息怎么保证多端一致性
5.怎么解决ViewModel过大的问题,MVVM和MVC的核心区别是双向绑定吗?
6.为什么选择SSE
相较于其他流式数据传输方式,SSE 的优点包括:
- 简单实现:SSE 使用标准的 HTTP 协议,易于实现和调试,尤其是对于基本的实时推送需求。
- 自动重连:SSE 支持自动重连机制,连接丢失后会自动尝试重新建立连接,确保数据传输的可靠性。
- 单向通信:适用于只需要从服务器到客户端的单向数据流的场景,例如新闻推送或实时更新。
- 轻量级:SSE 不需要额外的握手或复杂的协议栈,相比 WebSocket,SSE 的实现和维护成本较低。
- 文本数据:SSE 以 UTF-8 编码的文本格式传输数据,解析起来较为简单。
这些优点使 SSE 在需要简单、可靠的实时数据推送时成为一个合适的选择。
流式数据可以通过多种方式进行传输,具体选择取决于应用场景、性能需求和技术栈。以下是一些常见的流式数据传输方法:
1. WebSocket
- 描述:WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。与 HTTP 不同,它允许在客户端和服务器之间进行双向实时数据交换。
- 适用场景:需要双向实时通信的应用,例如在线游戏、实时聊天、协作工具。
- 优点:低延迟、双向通信、持久连接。
2. Server-Sent Events (SSE)
- 描述:SSE 允许服务器通过单向的持久连接向客户端推送实时事件。客户端可以通过 EventSource API 接收这些事件。
- 适用场景:需要从服务器向客户端推送实时数据的应用,例如实时更新的新闻推送、监控系统。
- 优点:简单易用、自动重连、支持文本数据。
3. HTTP/2
- 描述:HTTP/2 是 HTTP 协议的升级版,支持多路复用(multiplexing),允许在单个 TCP 连接上并发传输多个请求和响应。
- 适用场景:需要高效和快速加载的网页应用、实时更新的内容。
- 优点:减少延迟、提高传输效率、支持流式数据传输。
4. gRPC
- 描述:gRPC 是 Google 开发的开源高性能 RPC 框架,支持双向流式通信。基于 HTTP/2,提供了高效的通信机制。
- 适用场景:微服务架构、需要高效传输和处理大规模数据的系统。
- 优点:强类型、安全、高性能、支持双向流。
5. MQTT (Message Queuing Telemetry Transport)
- 描述:MQTT 是一种轻量级的消息传输协议,设计用于低带宽、不稳定的网络环境。支持发布/订阅模型。
- 适用场景:物联网(IoT)设备通信、低带宽网络中的消息传输。
- 优点:轻量、可靠、适合低带宽和高延迟的环境。
6. Apache Kafka
- 描述:Apache Kafka 是一个分布式流媒体平台,用于构建实时数据流应用和数据管道。支持高吞吐量的数据传输。
- 适用场景:需要处理大量实时数据的应用、数据管道、日志聚合。
- 优点:高吞吐量、可扩展、持久性、高可靠性。
7. Redis Streams
- 描述:Redis Streams 是 Redis 的一种数据结构,用于处理流数据。支持持久化、高效的流数据存储和处理。
- 适用场景:需要高效处理流数据的应用,例如实时数据分析、日志处理。
- 优点:高性能、简单易用、支持持久化和数据恢复。
8. WebRTC
- 描述:WebRTC 是一种支持浏览器之间直接进行实时通信的技术,支持视频、音频和数据流。
- 适用场景:视频会议、实时数据传输、点对点通信。
- 优点:低延迟、点对点通信、支持多种数据类型。
9. Chunked Transfer Encoding
- 描述:这是 HTTP/1.1 中的一种传输编码方式,允许服务器分块传输数据,客户端可以在接收数据时开始处理。
- 适用场景:需要逐步传输大数据的场景。
- 优点:支持动态生成和传输数据,减少了延迟。
10. Data Streams (File Streams)
- 描述:通过文件流传输数据,通常用于大文件的逐步传输和处理。
- 适用场景:大文件传输、流式处理数据。
- 优点:支持大数据文件的逐步传输、处理。
选择合适的流式数据传输方式需要考虑具体的应用需求、数据量、实时性要求、网络条件等因素。每种技术都有其特定的优点和适用场景。
7.离线包
8.webView cookie 丢失问题
iOS WebView 中的 Cookie 丢失通常可以由以下几个原因引起:
- App 重新启动:WebView 的 Cookie 存储在内存中,当应用被终止或重启时,这些 Cookie 可能会丢失。
- Cookies 设置:iOS 的 WebView 可能会受到应用的 Cookie 设置或隐私策略的影响,特别是在使用
WKWebView
时,它的 Cookie 存储可能与UIWebView
不同。 - 共享 Cookie:
WKWebView
和UIWebView
使用不同的 Cookie 存储机制,它们之间的 Cookie 可能无法共享。 - 域名问题:确保设置和读取 Cookie 的域名一致,跨域请求可能导致 Cookie 丢失。
解决方案:
使用
WKWebView
的WKWebsiteDataStore
:1
2
3let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
let dataStore = WKWebsiteDataStore.default()
webView.configuration.websiteDataStore = dataStore持久化 Cookie: 你可以手动持久化和恢复 Cookie。例如,通过
HTTPCookieStorage
保存 Cookie,然后在应用启动时恢复:1
2
3
4
5
6
7
8
9
10// Save cookies
if let cookies = HTTPCookieStorage.shared.cookies {
UserDefaults.standard.set(cookies.map { NSKeyedArchiver.archivedData(withRootObject: \$0) }, forKey: "savedCookies")
}
// Load cookies
if let cookieData = UserDefaults.standard.array(forKey: "savedCookies") as? [Data] {
let cookies = cookieData.compactMap { NSKeyedUnarchiver.unarchiveObject(with: \$0) as? HTTPCookie }
cookies.forEach { HTTPCookieStorage.shared.setCookie(\$0) }
}确保 WebView 配置正确:确保 WebView 使用的是适当的
WKWebViewConfiguration
,并且 Cookie 设置没有被隐私设置或其他配置所干扰。
这些方法可以帮助管理和解决 iOS WebView 中的 Cookie 丢失问题。
https://www.jianshu.com/p/8636ccd3674b
9.RN长列表性能问题