【问题标题】:Xcode NSURLConnection NSMutableData appdendData only works sometimesXcode NSURLConnection NSMutableData appdendData 有时只工作
【发布时间】:2013-02-28 07:03:37
【问题描述】:

我在读取来自 api 的响应时遇到了一个奇怪的问题。在 connectionDidFinishLoading 中,当将响应记录为字符串 [NSString stringWithUTF8String:[self.response bytes]] 时,该字符串有时会被正确记录,有时为空,有时是正确的响应,并在末尾附加随机字符。

在didReceiveData中,响应正常,但是使用appendData后出现问题。在 didReceiveData 我可以这样说明问题:

// This is always 0
NSLog(@"data length is %i", [data length]);
// This is always the correct response string sent from the api
NSLog(@"data string is %@", [NSString stringWithUTF8String:[data bytes]]);

NSMutableData *foo = [[NSMutableData alloc] init];
[foo appendData:data];

// This is always 8
NSLog(@"foo length is %i", [foo length]);
// This is only sometimes the correct response string!
NSLog(@"foo string is %@", [NSString stringWithUTF8String:[foo bytes]]);

[foo release];
foo = nil;

我在 SO 上看到了其他几个关于 appendData 类似疯狂问题的问题,但它们似乎是因为附加到的变量为零。这表明我已经清楚地声明了我的 NSMutableData foo,但它仍然没有正确设置。

【问题讨论】:

  • stringWithUTF8String 将假定字节为 utf8。这可能不会给出正确的结果。 Fabian Kreiser 的答案是更好的方法。

标签: ios objective-c nsurlconnection nsmutabledata


【解决方案1】:

请发布整个代码,而不仅仅是这段简短的摘录。

我假设您每次调用 -connection:didReceiveData: 时都会重新分配一个新的 NSMutableData 实例。您需要为此使用属性或 iVar,以便在后续调用 -connection:didReceiveData: 时将数据附加到已经存在的数据中。

- (void)startConnection
{
    self.receivedData = [[NSMutableData alloc] init];
    // Start connection...
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [self.receivedData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)
{
    NSString *receivedString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding];
    self.receivedData = nil;

    NSLog(@"Response: %@", receivedString);
}

【讨论】:

  • 抱歉,我认为缩小范围会有所帮助。我的转换为字符串的方法是问题,你解决了它。
  • 因此,为了后代,使用这个[[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]而不是这个[NSString stringWithUTF8String:[self.receivedData bytes]]从数据中获取字符串。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多