面试题答案
一键面试- 设置Socket连接并接收数据:
- 首先需要创建一个
CFReadStream
来接收数据。假设已经有一个有效的Socket连接socket
(这里简化为一个抽象的socket
对象,实际可能是CFSocket
等)。
CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocket(kCFAllocatorDefault, socket, &readStream, &writeStream); if (readStream) { // 设置读取流为自动释放 CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); CFReadStreamSetProperty(readStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNone); // 启动读取流 if (CFReadStreamOpen(readStream)) { // 创建一个缓冲区来读取数据 uint8_t buffer[1024]; CFIndex readBytes = CFReadStreamRead(readStream, buffer, sizeof(buffer)); if (readBytes > 0) { // 将读取到的数据转换为NSString NSString *receivedDataString = [[NSString alloc] initWithBytes:buffer length:readBytes encoding:NSUTF8StringEncoding]; // 这里可以进一步处理接收到的数据字符串 [self handleReceivedJSON:receivedDataString]; } } }
- 首先需要创建一个
- 解析JSON数据:
- 使用
NSJSONSerialization
来解析接收到的JSON数据。
- (void)handleReceivedJSON:(NSString *)jsonString { NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *error; id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error]; if (jsonObject &&!error) { if ([jsonObject isKindOfClass:[NSDictionary class]]) { NSDictionary *jsonDict = (NSDictionary *)jsonObject; // 这里可以根据具体的JSON结构处理字典中的数据 NSLog(@"解析后的JSON字典: %@", jsonDict); } else if ([jsonObject isKindOfClass:[NSArray class]]) { NSArray *jsonArray = (NSArray *)jsonObject; // 这里可以根据具体的JSON结构处理数组中的数据 NSLog(@"解析后的JSON数组: %@", jsonArray); } } else { NSLog(@"JSON解析错误: %@", error); } }
- 使用
解析逻辑:
- 接收数据:通过
CFReadStream
从Socket连接中读取数据,将读取到的数据放入缓冲区,然后转换为NSString
类型以便后续解析。 - JSON解析:将接收到的
NSString
转换为NSData
,然后使用NSJSONSerialization
的JSONObjectWithData:options:error:
方法进行解析。解析成功后,根据解析出来的对象类型(NSDictionary
或NSArray
)进行相应的数据处理。如果解析失败,记录并处理错误信息。
需要注意的是,上述代码是一个简化的示例,实际应用中可能需要处理更多的错误情况,例如流的关闭、内存管理、网络异常等情况。同时,在真实项目中可能会使用更高级的网络框架如AFNetworking等,这些框架对Socket通信及数据解析有更完善的封装和支持。