我有那个代码
func SendRequest(request: String) -> String { var response = "" var (success, errmsg) = client.connect(timeout: 1) if success { var (success, errmsg) = client.send(str: request + "\n" ) if success { while(true) { var data = client.read(10240*10) if (data == nil) { break } var bytes = NSData.init(bytes: data!, length: data!.count) var str = String.init(data: bytes, encoding: NSUTF8StringEncoding) if str != nil{ response += str! } } } else { print(errmsg) } } else { print(errmsg) } return response }
有时,强制转换NSData为String无效。当print(str)我看到nil。为什么会这样呢?我使用来自GitHub的SwiftSocket库。对不起我的英语不好。
NSData
String
print(str)
nil
当我的服务器发送大JSON字符串时会发生这种情况。例如- 如果我收到一个消息对象(我的班级)-一切都会正常。但是,如果我收到4,5,6,…消息对象(我的班级),这有时会起作用。MAGIC :( 新版本的代码
JSON
func SendRequest(request: String) -> String { var response = "" var bigData: [UInt8] = [] var (success, errmsg) = client.connect(timeout: 1) if success { var (success, errmsg) = client.send(str: request + "\n" ) if success { while(true) { var data = client.read(1024*10) if (data == nil) { break } bigData.appendContentsOf(data!) } } else { print(errmsg) } } else { print(errmsg) } var bytes = NSData.init(bytes: bigData, length: bigData.count) if let str = String(data: bytes, encoding: NSUTF8StringEncoding) as String? { print(str) response = str } return response }
注意:我不会讲Swift。以下代码可能无法编译,但应为您提供背后的主要思想/逻辑。
问题是因为存在NSData不完整的情况(假设您确实可以NSString根据所使用的编码将字节真正转换为字节,因此您需要逐个接收它们,并且缓冲区大小可能不足以一次处理完整的响应),如@zaph所指出的那样。 。简单示例:例如,将aUIImage转换为NSData使用UIImageJPEGRepresentation(),然后尝试NSString使用所需的编码将其转换为,这可能无效,或者对视频流也是如此。
NSString
UIImage
UIImageJPEGRepresentation()
我们的情况的示例: 完全有效的“字符”:“ 1001”,不带“ 10”或“ 01”的内容。 您只收到“ 10”。如果将其转换为NSString,则为nil,因为它无效。 然后,您收到“ 01”。如果将其转换为NSString,则为nil,因为它无效。因此,NSData在将其转换为之前,您必须先阅读所有内容NSString。
因此,在开始时,您可以创建一个。var finalData = NSMutableData.init() 然后,每次读取缓冲区时,请执行以下操作:
var finalData = NSMutableData.init()
var partialData = NSData.init(bytes: data, length: data.count) finalData.appendData(partialData)
最后,只需转换finalData为String:
finalData
if let str = String(data:finalData, encoding: NSUTF8StringEncoding) { response = str }