【问题标题】:Canceling a ASIHTTPRequest - Beginner取消 ASIHTTPRequest - 初学者
【发布时间】:2012-04-19 15:39:58
【问题描述】:

我正在使用 ASIHTTPRequest 向 Web 服务器发送请求。一切正常。但是现在,当我调用 grabURLInBackground 方法时,会向给定的 URL 发送一个请求。

但是现在,我需要在viewWillDissapear 方法中取消请求(如停止发送,并停止从 URL 下载内容)。我怎样才能做到这一点 ?帮助

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
   // Use when fetching text data
   NSString *responseString = [request responseString];

   // Use when fetching binary data
   NSData *responseData = [request responseData];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}

【问题讨论】:

    标签: iphone objective-c cocoa-touch asihttprequest


    【解决方案1】:
    for (ASIHTTPRequest *req in ASIHTTPRequest.sharedQueue.operations)
    {
        [req cancel];
        [req setDelegate:nil];
    }
    

    这应该取消它..

    【讨论】:

    • 我没有在我的应用程序中使用Queue in ASIHTTPRequest。那我可以用你的代码吗?
    • 如果我在 VIewDidDissapear 或 ViewDidUnload 中使用它会怎样?我有一个标签栏控制器,所以在请求运行时,如果用户点击另一个栏,我需要取消请求。您认为使用您的代码解决它是否理想?
    • 精炼评论:如果你不使用自己的队列,它在内部使用 NSOperationQueue。我认为它应该可以工作。但只能在 viewDidDisappear 中使用它,否则它可能会取消来自其他视图控制器的其他请求,如果你正在使用任何。
    【解决方案2】:

    你可以这样做:

    [request cancel]
    

    或者:

    [request clearDelegatesAndCancel];
    

    可以在文档here 中看到。

    我建议存储对该请求的引用,以便在离开视图时取消它。

    【讨论】:

    • 您如何看待@AnkitSrivastava 的回答,它会取消请求而无需存储请求的引用吗?
    • 是的,这是一个很好的方法,即 ASIHTTPRequest 的所有正在运行的请求的共享队列。除非您正在运行其他请求并且只想取消该请求。
    • 感谢您的回答和回复,确实有帮助
    【解决方案3】:

    来自 ASIHttp 文档的 GOt thsi:

    取消异步请求

    要取消异步请求(使用 [request startAsynchronous] 启动的请求或在您创建的队列中运行的请求),请调用 [request cancel]。请注意,您无法取消同步请求。

    请注意,当您取消请求时,请求会将其视为错误,并会调用您的委托和/或队列的失败委托方法。如果您不希望这种行为,请在调用取消之前将您的委托设置为 nil,或者改用 clearDelegatesAndCancel 方法。

    // 取消异步请求

    [请求取消]

    //取消一个异步请求,

    首先清除所有代表和块 [request clearDelegatesAndCancel];当使用 ASINetworkQueue 时,除非队列的 shouldCancelAllRequestsOnFailure 为 NO(默认为 YES),否则当您取消单个请求时,所有其他请求都将被取消。

    //当这个队列中的一个请求失败或被取消时,其他请求会继续运行

    [队列设置ShouldCancelAllRequestsOnFailure:NO];

    // 取消队列中的所有请求

    [队列 cancelAllOperations];

    【讨论】:

    • "当使用 ASINetworkQueue 时,当您取消单个请求时,所有其他请求都将被取消,除非队列的 shouldCancelAllRequestsOnFailure 为 NO(YES 是默认值)。" -- 这很关键,我试图弄清楚为什么当我取消一个请求时我的所有请求都被杀死了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2012-12-20
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多