我创建了一个类,用于在iOS-App中获取服务器端数据,基于NSURLConnection,将获取的数据转发给委托进行处理。
下载text / json时效果很好。
我现在正在扩展以获取一些png图像,无法获取数据。
我发现它在didReceiveData调用中断了,其中[receivedData appendData:data]对接收到的图像数据没有任何作用。
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
[receivedData appendData:data];
}
我将数据输入此方法(NSData> 0字节),但调用[receivedData appendData:data]不会更改receivedData的大小(仍为0字节)。
由于这与文本完美配合而不是图像数据,我认为它与字符集或编码有关,但无法找到任何内容。
感谢任何帮助。
更新:
在进行通话的方法中:
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
// Create the NSMutableData to hold the received data.
receivedData = [NSMutableData data];
// Also tried with no change in behaviour
// receivedData = [[NSMutableData alloc] initWithLength:0];
} else {
// Inform the user that the connection failed.
}
我的didReceiveResponse
:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[receivedData setLength:0];
}
另一个更新
将问题归结为并发性,因为我同时触发了三个类的实例以异步获取三个文件。问题是,在完成破坏来自其他两个实例的响应时,第一个版本会释放receivedData
。
如何确保班级的每个实例都有自己的receivedData
来玩?
最终笔记 使用MutableArrays的字典来检索并发问题。
似乎将MutableArray定义为类的私有属性为每个实例创建一个数组。
@interface MyClass(){
@private NSMutableData * receivedData;
}
答案 0 :(得分:1)
您是否初始化receivedData
?
这样的事情可以做到:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
if(!receivedData)
{
receivedData = [NSMutableData data];
}
[receivedData appendData:data];
}
更快的方法是在您启动实际请求之前对其进行初始化(以便每次收到数据时都不会对其进行检查)。
还要记住,当您的请求完成后,您已完成提取receivedData
,以便它可以为下一个请求做好准备。
以下是并发请求的一种解决方案:
创建NSMutableDictionary而不是单个NSMutableData属性,以便您可以一次挂起到多个实例。
NSMutableDictionary *receivedData
现在,将NSURLConnection(我们称之为urlConnection
)放在一起后,您可以创建一个新的唯一数据对象并将其放入字典中。您应该能够使用连接的字符串描述作为唯一键。
if(!receivedData)
receivedData = [NSMutableDictionary dictionary];
NSMutableData *dataObject = [NSMutableData data];
[receivedData setObject:dataObject forKey:[urlConnection description]];
现在你可以这样做:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSMutableData *currentData = (NSMutableData*)[receivedData objectForKey:[connection description]];
[currentData.appendData:data];
}
连接完成后,请记得在不再需要数据对象后调用removeObjectForKey
来删除它们。
答案 1 :(得分:0)
我找到了一个可行的解决方法,即将JSON响应中编码的数据base64发送到设备并在设备本地使用文件之前对其进行解码。
这也证明非常有用,因为它可以传输一个请求中所需的三个文件。