2

バッチで送信される一連のURLリクエストと、結果を受け取る'catcher'クラスがあります。これはFacebookのグラフAPISDKを介して行っているため、実際の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;
}
4

1 に答える 1

2

上で説明したように、特定の時間が経過するとデリゲートオブジェクトにシグナルを送信するをインスタンス化することで、独自のタイムアウトを実装できます。NSTimer

于 2012-04-21T15:53:35.723 に答える