2016-04-27 54 views
2

我有一個代碼爲什麼不將工作從NSData轉換爲字符串?斯威夫特

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 
} 
+1

有時數據可能比一個字符串更復雜,可能需要被轉換爲NSArray或NSDictionary嘗試添加此 – SeanLintern88

+0

我只收到來自我的服務器的JSON字符串 - 這是「比字符串更復雜」? –

+0

檢查'bytes'不是'nil'。 –

回答

1

注:我不會說斯威夫特。下面的代碼可能無法編譯,但它應該給你背後的主要思想/邏輯。

這個問題是因爲NSData不完整(你一個接一個地接收它們,並且緩衝區大小可能不足以一次處理完整的響應),假設根據所使用的編碼字節真的可轉換爲NSString@zaph所指出的那樣。 簡單示例:例如,使用UIImageJPEGRepresentation()UIImage轉換爲NSData,並嘗試使用所需的編碼將其轉換爲NSString,它可能無效,或者對視頻流執行相同操作。

本例的示例:
完整有效的「字符」:「1001」,不帶「10」或「01」。
您只收到「10」。如果您將其轉換爲NSString,則它爲零,因爲它無效。
然後,您收到「01」。如果您將其轉換爲NSString,則它爲零,因爲它無效。
因此,在將其轉換爲NSString之前,您必須先閱讀所有的NSData

因此,在開始時,你可以創建一個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 
} 
1

一些可能性來檢查包括數據實際上是否包含任何字節,它是否真的是一個有效的UTF-8字符串。假設這是一個HTTP請求/如果數據的編碼方式不是UTF-8格式,則不會轉換爲字符串

+0

我更新了主題。 –

1

回答: 「有時,將NSData強制轉換爲字符串不起作用。」
並非所有數據都可以轉換爲特殊字符r字符串編碼。在這種情況下:

var str = String.init(data: bytes, encoding: NSUTF8StringEncoding) 

有大量的字節和字節序列沒有有效的UTF-8字符編碼。

相關問題