2010-10-04 57 views
2

我有一個使用auth_token的REST服務,每隔 經常會過期。當一個請求失敗,我要重新進行身份驗證(這我 能夠做到),然後重新發送在 完全相同TTURLRequest以下通用方式:three20 TTURLRequest重新發送

- (void)request:(TTURLRequest*)request didFailLoadWithError: 
(NSError*)error { 
     NSLog(@"error %@ %@ %@", [error localizedDescription], [error 
localizedFailureReason], [error localizedRecoverySuggestion] 
       ); 


     if (numRetries == 0) { 
       [self authenticateUser:nil]; 

       request.urlPath = [request.urlPath 
stringByReplacingOccurrencesOfRegex:@"access_token=([\\w-]+)" 
withString:[NSString stringWithFormat:@"access_token=%@", 
accessToken]]; 

       NSLog(@"URL: %@", request.urlPath); 
       [request send]; 

       numRetries++; 

     } 

} 

我所有的TTURLRequest S的使用相同的代表使用此失敗的方法 方法。但由於某種原因,當我致電[請求發送]時,請求 進入「加載」階段,但似乎並未完成。 但是,如果我做手動刷新(通過拖動表視圖)它 從頭重新生成TTURLRequest似乎工作正常。

「重新發送」此請求的正確方法是什麼?

回答

0

我最近遇到了同樣的問題。我還沒有足夠深入地探索Three20,知道是否試圖重試失敗的請求,但是我發現這個問題和一個可靠的(和簡單的)修復。

第二次調用[請求發送]後,TTURLRequest實例在完成加載前取消分配。如果您查看Three20Network中的TTURLRequestModel.m,您可以看到模型的最後一個請求(_loadingRequest)在新請求被保留之前被釋放。如果最後一個請求恰好是一樣的新請求(因爲它是在你的情況下),它的保留計數爲0,它被dealloc'd:

///////////////////////////////////////////////////////////////////////////// 
- (void)requestDidStartLoad:(TTURLRequest*)request { 
    [_loadingRequest release]; 
    _loadingRequest = [request retain]; 
    [self didStartLoad]; 
} 

我通過繼承TTURLRequestModel.m解決這一點,用以下代碼覆蓋此方法:

///////////////////////////////////////////////////////////////////////////////// 
- (void)requestDidStartLoad:(TTURLRequest*)request { 
    [request retain]; 
    [_loadingRequest release]; 
    _loadingRequest = request; 
    [self didStartLoad]; 
} 

這在我的測試中起作用,似乎不會對消極影響有任何影響。

注意:如果您爲請求的響應對象使用TTURLJSONResponse,則需要在調用send之前分配一個新實例並將其設置爲request.response。如果您查看extThree20JSON中的TTURLJSONResponse.m,您會看到processResponse方法聲明(nil == _rootObject)。如果以前在請求中使用了響應實例,則這將失敗。