.h
@property (strong) NSString *reply;
我有以下方法:NSURL连接sendAsynchronousRequest如何保存响应?
.m
@synthesize reply;
- (void)send
{
[NSURLConnection sendAsynchronousRequest:[self request]
queue:[[NSOperationQueue alloc] init]
completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error)
{
if (error)
{
//NSLog(@"Error,%@", [error localizedDescription]);
[self setReply: [[NSString alloc] initWithString:[error localizedDescription]]];
}
else
{
//NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
[self setReply: [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]];
}
}];
}
现在,我试图从块/处理程序返回一个值,但显然这是不可能的(或者我还没有想出的语法还)。
我试图设置一个局部变量来获得答复(数据)的值,但它会产生错误。
错误没有产生的唯一方法是使用类属性。但是当我试图读取[自我回复]的价值时,它是空的,这使我认为它从未设置。
据我所知,sendAsync函数是线程和异步的,所以是[自我答复]的值为空的原因,而当我使用sendSynchronousRequest,我总是得到答复?
我做错了什么,以及如何从completionHandler内返回一个值?
编辑#1:在我看来,我做的事情非常错误。我正在追踪代码,当我使用同步发送时,一切正常。使用异步方式,对于sendAsynchronousRequest的实际调用从未执行,这让我认为该线程没有被调用,因此它是空值。
编辑#2:我已经找到解决的办法,通过增加以下内容:
[NSURLConnection sendAsynchronousRequest:[self request]
queue:[NSOperationQueue alloc] init
completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error)
{
if (error)
{
//NSLog(@"Error,%@", [error localizedDescription]);
[self setReply: [[NSString alloc] initWithString:[error localizedDescription]]];
}
else
{
//NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
[self setReply: [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]];
}
}];
[[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 2]];
不过,我不能完全肯定我理解它是如何工作的。我想象RunLoop会告诉异步操作运行2秒(我可以验证,因为在将日期间隔设置为较低值时,由于使用活动服务器进行测试,我得到空响应)。我不明白的是,当我告诉RunLoop运行时,它永远阻止一切,就好像当前线程永不终止一样。
我不明白的问题/问题。为什么不能从块完成功能返回一个值? setReply函数有什么作用?向我们显示代码 – Lefteris 2012-04-24 15:10:21
设置断点以查看数据是否有效或为空。 你在正确的轨道上,这似乎有效,但你可能没有得到可以使用的信息。 – 2012-04-24 15:28:21
该块被指定为具有void返回类型,所以块本身不能返回值 - 但为什么需要返回值?我猜你的setReply函数只是一个实例变量的setter?在这种情况下,您不需要从块中返回任何内容,因为当您设置回复时将会捕获响应。使用本地变量捕获数据值时产生的错误是什么?你应该能够设置一个断点来查看数据。另外,我会添加检查您收到的响应代码。 – tronbabylove 2012-04-24 15:29:06