【问题标题】:Request timeout with Facebook API on iOS在 iOS 上使用 Facebook API 请求超时
【发布时间】:2012-04-21 23:54:52
【问题描述】:

我有一堆批量发送的 URL 请求,然后是一个接收结果的“捕手”类。我通过 facebook 的图形 API SDK 执行此操作,因此我无法控制实际的 NSURL。我的问题是,在所有请求都返回之前,我不会触发下一个结果协议,但有时,尤其是在 3G 上,它们并不总是返回(尤其是当你有几百个请求时)。什么是“放弃”给定请求的好方法?对于那些不熟悉 FB api 的人来说,实际请求的工作方式是初始化一个 facebook 对象,然后从中请求数据,然后指定一个返回委托。因此,对于每个单独的请求,我都有一个 returnDelegate(捕手),我可以针对每个请求进行初始化。

更新:来自 FB-API 的一些代码

- (FBRequest*)requestWithMethodName:(NSString *)methodName
                          andParams:(NSMutableDictionary *)params
                      andHttpMethod:(NSString *)httpMethod
                        andDelegate:(id <FBRequestDelegate>)delegate {
    NSString * fullURL = [kRestserverBaseURL stringByAppendingString:methodName];
    return [self openUrl:fullURL
                  params:params
              httpMethod:httpMethod
                delegate:delegate];
}

- (FBRequest*)openUrl:(NSString *)url
               params:(NSMutableDictionary *)params
           httpMethod:(NSString *)httpMethod
             delegate:(id<FBRequestDelegate>)delegate {

    [params setValue:@"json" forKey:@"format"];
    [params setValue:kSDK forKey:@"sdk"];
    [params setValue:kSDKVersion forKey:@"sdk_version"];
    if ([self isSessionValid]) {
        [params setValue:self.accessToken forKey:@"access_token"];
    }

    [self extendAccessTokenIfNeeded];

    FBRequest* _request = [FBRequest getRequestWithParams:params
                                               httpMethod:httpMethod
                                                 delegate:delegate
                                               requestURL:url];
    [_requests addObject:_request];
    [_request addObserver:self forKeyPath:requestFinishedKeyPath options:0 context:finishedContext];
    [_request connect];
    return _request;
}

- (void)connect {

    if ([_delegate respondsToSelector:@selector(requestLoading:)]) {
        [_delegate requestLoading:self];
    }

    NSString* url = [[self class] serializeURL:_url params:_params httpMethod:_httpMethod];
    NSMutableURLRequest* request =
    [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
                            cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                        timeoutInterval:kTimeoutInterval];
    [request setValue:kUserAgent forHTTPHeaderField:@"User-Agent"];


    [request setHTTPMethod:self.httpMethod];
    if ([self.httpMethod isEqualToString: @"POST"]) {
        NSString* contentType = [NSString
                             stringWithFormat:@"multipart/form-data; boundary=%@", kStringBoundary];
        [request setValue:contentType forHTTPHeaderField:@"Content-Type"];

        [request setHTTPBody:[self generatePostBody]];
    }

    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    self.state = kFBRequestStateLoading;
    self.sessionDidExpire = NO;
}

【问题讨论】:

  • 请求类是什么?一些代码?
  • @noa 刚刚添加了一些。需要帮助理解它。是否有一种 hacky 方法可以为每个在到达特定时间后向委托发送消息的请求添加文字计时器?
  • 当然,我认为 NSTimer 可以做到这一点。如果您同时触发请求,则可以为所有请求使用一个计时器。
  • Naaaah 我需要为每个请求设置一个计时器。我的想法是我会发出一堆请求(比如 100 个),并且在分配的时间内返回的都是我会使用的请求。运行这么多线程会不会很麻烦?
  • 对不起,我真的不知道。如果有 100 个请求有效,我认为 100 个请求 + 100 个计时器也可以。

标签: objective-c xcode cocoa-touch facebook-graph-api


【解决方案1】:

如上所述,您可以实现自己的超时,方法是实例化 NSTimer,它会在经过一定时间后向委托对象发出信号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2013-11-12
    • 1970-01-01
    • 2019-09-27
    • 2014-08-15
    • 1970-01-01
    相关资源
    最近更新 更多