【问题标题】:Pass Result of ASIHTTPRequest "requestFinished" Back to Originating Method将 ASIHTTPRequest“requestFinished”的结果传回原始方法
【发布时间】:2010-05-20 23:37:30
【问题描述】:

我有一个使用 ASIHTTPRequest 库发起 HTTP 请求的方法 (getAllTeams:)。

NSURL *httpURL = [[[NSURL alloc] initWithString:@"/api/teams" relativeToURL:webServiceURL] autorelease];

ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:httpURL] autorelease];
[request setDelegate:self];
[request startAsynchronous];

我想做的是调用[WebService getAllTeams] 并让它在NSArray 中返回结果。目前,getAllTeams 没有返回任何内容,因为 HTTP 响应是在 requestFinished: 方法中评估的。

理想情况下,我希望能够调用[WebService getAllTeams],等待响应,然后将其转储到 NSArray 中。我不想创建属性,因为这是一次性类(意味着它不存储任何值,只是检索值),并且多个方法将使用同一个 requestFinished (它们都返回一个数组)。

我已经阅读了一些关于代表和 NSNotifications 的内容,但我不确定它们中的任何一个是否是最好的方法。我发现 this snippet 关于通过将选择器作为参数传递来实现回调,但它没有成功(因为 requestFinished 独立触发)。

有什么建议吗?即使只是指出正确的方向,我也会很感激。

NSArray *teams = [[WebService alloc] getAllTeams];(目前不起作用,因为 getAllTeams 不返回任何内容,但 requestFinished 会。我想获取 requestFinished 的结果并将其传递回 getAllTeams :)

【问题讨论】:

    标签: iphone objective-c delegates callback asihttprequest


    【解决方案1】:

    在调用的同时发送对原始类实例的引用:

    [WebService getAllTeams:self];
    

    然后修改-getAllTeams 以接受对原始实例的引用:

    - (void) getAllTeams:(id)sender {
        // ...
        [request setDelegate:sender];
        // ...
    }
    

    您的原始实例将负责处理响应和清理内存。

    【讨论】:

    • 我是否可以使用此方法访问 responseString / responseData,还是我需要自己处理?
    • 您的委托方法(在您的原始类实例中)可以访问responseStringresponseData,因为这些方法传递了对request 的引用。
    • 可以使用这种方法进行异步调用吗?我一直在弄乱它,但无法让它工作。只是想弄清楚发生了什么。感谢您迄今为止的帮助。
    • 是的,当然。但是,我在我的应用程序委托中创建了一个ASINetworkQueue 的实例,而不是[request startAsynchronous],并将任何request 实例添加到此队列中。队列将按照它们添加的顺序处理它们:先进先出。 ASINetworkQueueASIHTTPRequest 的一部分——阅读网站文档以了解如何设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多