gpt4 book ai didi

ios - NSURL Connection sendAsynchronousRequest 如何保存响应?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:50:12 28 4
gpt4 key购买 nike

.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] 的值时,它是空的,这让我认为它从未被设置过。

我知道 sendAsync 函数是线程化和异步的,所以 [self reply] 的值为 null 的原因是什么,而当我使用 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 运行时,它会永远阻塞一切,就好像当前线程永远不会终止一样。

最佳答案

去掉 runUntilDate 并尝试使用 [NSOperationQueue mainQueue],看看是否有任何改变。

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com