• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - NSURL 连接 sendAsynchronousRequest 如何保存响应?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 20:33:01 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

.h
@property (strong) NSString *reply;

我有以下方法:

.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]];
                            } 
                        }];

}

现在,我尝试从 block /处理程序返回一个值,但显然这是不可能的(或者我还没有弄清楚语法)。

我试图设置一个局部变量来获取回复(数据)的值,但它会产生错误。

不产生错误的唯一方法是使用类属性。但是当我尝试读取 [self reply] 的值时,它是 null,这让我觉得它永远不会被设置。

我知道sendAsync函数是线程异步的,所以[self reply]的值为null的原因,而当我使用sendSynchronousRequest时,我总是得到回复???

我做错了什么,如何从 completionHandler 中返回一个值???

Edit#1:在我看来,我做错了什么。我正在跟踪代码,当我使用同步发送时,一切正常。使用异步的,对 sendAsynchronousRequest 的实际调用从未执行,让我认为线程没有被调用,因此是空值。

Edit#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 运行时,它会永远阻塞一切,就好像当前线程从未终止一样。



Best Answer-推荐答案


摆脱那个 runUntilDate 并尝试使用 [NSOperationQueue mainQueue],看看这是否会改变任何东西。

[NSURLConnection sendAsynchronousRequest:[self request] 
             queue:[NSOperationQueue mainQueue]
             completionHandler:
                    ^(NSURLResponse *response, NSData *data, NSError *error)...     

关于ios - NSURL 连接 sendAsynchronousRequest 如何保存响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10300707/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap