百川智能

百川智能

一面:

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. ( 1^2 = 1 )
  2. ( 2^2 = 4 )
  3. ( 3^2 = 9 )
  4. ( 4^2 = 16 )
  5. ( 5^2 = 25 )
  6. ( 6^2 = 36 )
  7. ( 7^2 = 49 )
  8. ( 8^2 = 64 )
  9. ( 9^2 = 81 )
  10. ( 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 的优点包括:

  1. 简单实现:SSE 使用标准的 HTTP 协议,易于实现和调试,尤其是对于基本的实时推送需求。
  2. 自动重连:SSE 支持自动重连机制,连接丢失后会自动尝试重新建立连接,确保数据传输的可靠性。
  3. 单向通信:适用于只需要从服务器到客户端的单向数据流的场景,例如新闻推送或实时更新。
  4. 轻量级:SSE 不需要额外的握手或复杂的协议栈,相比 WebSocket,SSE 的实现和维护成本较低。
  5. 文本数据: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 丢失通常可以由以下几个原因引起:

  1. App 重新启动:WebView 的 Cookie 存储在内存中,当应用被终止或重启时,这些 Cookie 可能会丢失。
  2. Cookies 设置:iOS 的 WebView 可能会受到应用的 Cookie 设置或隐私策略的影响,特别是在使用 WKWebView 时,它的 Cookie 存储可能与 UIWebView 不同。
  3. 共享 CookieWKWebViewUIWebView 使用不同的 Cookie 存储机制,它们之间的 Cookie 可能无法共享。
  4. 域名问题:确保设置和读取 Cookie 的域名一致,跨域请求可能导致 Cookie 丢失。

解决方案:

  1. 使用 WKWebViewWKWebsiteDataStore

    1
    2
    3
    let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
    let dataStore = WKWebsiteDataStore.default()
    webView.configuration.websiteDataStore = dataStore
  2. 持久化 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) }
    }
  3. 确保 WebView 配置正确:确保 WebView 使用的是适当的 WKWebViewConfiguration,并且 Cookie 设置没有被隐私设置或其他配置所干扰。

这些方法可以帮助管理和解决 iOS WebView 中的 Cookie 丢失问题。

https://www.jianshu.com/p/8636ccd3674b

9.RN长列表性能问题

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×