【问题标题】:How to tell if TWRequest performRequestWithHandler failed or succeeded如何判断 TWRequest performRequestWithHandler 是失败还是成功
【发布时间】:2012-08-19 13:08:36
【问题描述】:

我正在发布请求并检查如下错误:

// Send request out on a background thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
    [postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        if ([urlResponse statusCode] == 200) {
            NSLog(@"Tweet Successful");
        }else {
            NSLog(@"Tweet Failed");
            if (responseData) {
                //  Use the NSJSONSerialization class to parse the returned JSON
                NSError *jsonError;
                NSArray *requestResponse =
                [NSJSONSerialization JSONObjectWithData:responseData
                                                options:NSJSONReadingMutableLeaves
                                                  error:&jsonError];

                if (requestResponse) {
                    NSLog(@"%@",requestResponse);
                } else {
                    NSLog(@"%@",jsonError);
                }
            }
        }
    }];
});

就请求而言,它似乎工作正常。我的意图是将失败的请求排队并在以后重试,或者不取决于错误以及到目前为止失败的尝试次数。 我遇到的问题是,我发现它经常出现失败,错误 34“未找到页面”实际上请求确实成功,按预期发布,并且可以在 Twitter 流中清晰地看到。

现在,如果我不能相信返回的错误代码,那么我真的无法继续重试。我如何确定它是成功还是失败?

近期观察:

最近,我尝试直接从 Apple 照片应用发布一张照片,它向我发送了一条警告,上面写着“Tweet 可能没有成功”。这很有趣,因为这基本上是我在这种情况下唯一的选择。这让我觉得即使是 Apple 也不得不承认,当退货未确认时,无法确定帖子是否失败。

【问题讨论】:

  • 实际日志打印输出为:errors = ( { code = 34; message = "对不起,该页面不存在"; }
  • 您还应该分享您在此处执行的示例 URL 吗?
  • 传递给块的 NSError *error 怎么样?
  • @defactodeity - 构建上面的 TWRequest 并且不显示,因为它似乎不相关。请求很少失败,推文是成功的。我的问题是,有时响应表明失败,即使它确实成功了。
  • @Moxy - 我没有检查 NSError,不确定它是否返回任何内容,因为帖子确实成功了。我没有在 URLResponse 中读取 200,因此测试响应数据并获取上面的消息。

标签: ios twitter twrequest


【解决方案1】:

根据在研究此问题时发现的每个示例,除了您正在使用的之外,没有一个使用任何其他 API,包括this example from twitter's own documentation 用于将照片发布到 API,它们都没有首先检查 urlResponse 代码。

似乎做过的最多的是this example from twitter's documentation,其中执行了 GET,然后处理了响应。请注意,它首先检查 responseData,如果存在,则将其视为成功。只有在没有 responseData 的情况下才会尝试查看错误。该示例与 urlResponse 无关……我在 10 分钟的谷歌搜索中看到的任何其他示例也没有。

(最后,我怀疑这很重要,或者可能是因为您清理了显示的示例,但是当您没有执行任何 UI 时,您正在处理主队列上的错误。您可以立即在处理程序中进行处理,并将您所做的任何后处理传递给您尝试显示它的任何 UI。我怀疑在主队列中对响应进行后处理,而不是在处理程序的队列中(如显示在此处引用的两个示例和我见过的所有其他示例中)确实造成了问题,但我想知道它是否可以减少您看到的假阴性的发生率。至少,它会让您做出回应和响应的任何 UI 显示更简洁、更高效。)

【讨论】:

  • 我看到后一个示例不需要 url 响应,因为它检查返回的数组是否有效。在我的情况下,这不适用于 POST。据我所知,在这种情况下唯一要做的就是 URLResponse。您对线程处理是正确的,尽管我认为这不适用于我的具体问题。如果在我的工作代码中没有更正它,我确实打算允许它在调用线程上继续进行,这绝不是主线程。
  • 我想我的意思主要是,在第 1 段的链接中,即使是 twitter 自己的示例也不会费心检查 urlResponse 是否有错误……我只是没有看到任何其他示例也可以的代码。
  • 感谢您的意见,我并不是说您错了。除非我弄错了,否则在我的情况下它对我没有多大帮助。使用 POST,URLResponse 真的是你所要做的。一旦发出,我怎么知道它是否成功?大多数时候,我确实收到 200 条回复,一切都很好。当它失败时,通常是网络错误、超时或其他原因,我会得到另一个响应。不幸的是,有时即使在一条成功的推文否定了它的有用性之后,我也会收到 200 条回复。
  • 我得出的结论是,由于这是 twitter 的问题,我们在客户端所能做的最好的事情就是尽可能优雅地处理它(参见 Apple 模棱两可的“Tween可能没有成功”)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 2019-02-09
相关资源
最近更新 更多