面试题答案
一键面试Objective-C 端处理与传递数据
- 将复杂数据结构转换为 JSON 格式:
- 使用
NSJSONSerialization
类将包含嵌套字典和数组的复杂数据结构转换为 JSON 数据。例如:
NSDictionary *nestedDictionary = @{ @"key1": @"value1", @"key2": @[@1, @2, @3], @"key3": @{ @"subKey1": @"subValue1", @"subKey2": @[@4, @5] } }; NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:nestedDictionary options:NSJSONWritingPrettyPrinted error:&error]; if (error) { NSLog(@"JSON serialization error: %@", error); return; } NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
- 使用
- 传递数据给 React Native:
- 如果是通过桥接方式(如 React Native 自带的桥接机制),通常会将这个 JSON 字符串传递给 React Native。例如,在 RCTBridgeModule 中定义一个方法传递数据:
- (NSArray<NSString *> *)supportedEvents { return @[@"dataUpdate"]; } - (void)sendDataToReactNative { NSString *jsonString =... // 上述生成的 JSON 字符串 [self sendEventWithName:@"dataUpdate" body:jsonString]; }
React Native 端接收与解析数据
- 接收数据:
- 在 React Native 中,通过注册对应的事件监听器来接收数据。例如:
import React, { useEffect } from'react'; import { NativeEventEmitter, NativeModules } from'react-native'; const MyModule = NativeModules.MyModule; const emitter = new NativeEventEmitter(MyModule); const MyComponent = () => { useEffect(() => { const subscription = emitter.addListener('dataUpdate', (data) => { // 这里 data 就是接收到的 JSON 字符串 }); return () => { subscription.remove(); }; }, []); return null; }; export default MyComponent;
- 解析数据:
- 使用
JSON.parse
方法将接收到的 JSON 字符串解析为 JavaScript 对象。例如:
useEffect(() => { const subscription = emitter.addListener('dataUpdate', (data) => { try { const parsedData = JSON.parse(data); console.log(parsedData); } catch (error) { console.error('JSON parsing error:', error); } }); return () => { subscription.remove(); }; }, []);
- 使用
传递过程中可能遇到的问题及解决方案
- 数据格式问题:
- 问题:如果 Objective - C 端生成的 JSON 数据格式不正确,React Native 端解析时会报错。例如,字典中的键不是字符串类型等。
- 解决方案:在 Objective - C 端确保传递的数据结构完全符合 JSON 规范,即字典的键必须是字符串,所有值必须是 JSON 支持的类型(如字符串、数字、布尔值、数组、字典)。在生成 JSON 数据前,仔细检查数据结构。
- 编码问题:
- 问题:如果在 Objective - C 端生成 JSON 数据时指定的编码与 React Native 端期望的编码不一致,可能导致解析失败。
- 解决方案:统一使用 UTF - 8 编码,在 Objective - C 端生成 JSON 字符串时使用
NSUTF8StringEncoding
,React Native 端默认也会按 UTF - 8 处理接收到的字符串。
- 数据大小问题:
- 问题:如果传递的 JSON 数据量过大,可能会导致性能问题,甚至在传递过程中出现内存溢出等错误。
- 解决方案:尽量优化数据结构,减少不必要的数据传递。如果无法避免大数据量传递,可以考虑分批传递数据,或者在 Objective - C 端对数据进行压缩后传递,React Native 端解压后解析。