一尘不染

为什么不将工作从NSData转换为String?迅速

swift

我有那个代码

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
}

有时,强制转换NSDataString无效。当print(str)我看到nil。为什么会这样呢?我使用来自GitHub的SwiftSocket库。对不起我的英语不好。

当我的服务器发送大JSON字符串时会发生这种情况。例如-
如果我收到一个消息对象(我的班级)-一切都会正常。但是,如果我收到4,5,6,…消息对象(我的班级),这有时会起作用。MAGIC :(
新版本的代码

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
}

阅读 177

收藏
2020-07-07

共1个答案

一尘不染

注意:我不会讲Swift。以下代码可能无法编译,但应为您提供背后的主要思想/逻辑。

问题是因为存在NSData不完整的情况(假设您确实可以NSString根据所使用的编码将字节真正转换为字节,因此您需要逐个接收它们,并且缓冲区大小可能不足以一次处理完整的响应),如@zaph所指出的那样。
。简单示例:例如,将aUIImage转换为NSData使用UIImageJPEGRepresentation(),然后尝试NSString使用所需的编码将其转换为,这可能无效,或者对视频流也是如此。

我们的情况的示例:
完全有效的“字符”:“ 1001”,不带“ 10”或“ 01”的内容。 您只收到“ 10”。如果将其转换为NSString,则为nil,因为它无效。 然后,您收到“ 01”。如果将其转换为NSString,则为nil,因为它无效。因此,NSData在将其转换为之前,您必须先阅读所有内容NSString

因此,在开始时,您可以创建一个。var finalData = NSMutableData.init() 然后,每次读取缓冲区时,请执行以下操作:

var partialData = NSData.init(bytes: data, length: data.count)
finalData.appendData(partialData)

最后,只需转换finalDataString

if let str = String(data:finalData, encoding: NSUTF8StringEncoding) {
    response = str
}
2020-07-07