0

我有一個IOS應用程序使用azure存儲blob jpg照片。我的問題是檢索blob顯示。我的天藍色blob永遠不會返回,但沒有錯誤是

大多數情況下他們檢索得很好。但偶爾一個奇怪的將不會被退回。而是返回749字節,但錯誤仍然= nil。

現在,這會很好,真的沒有問題。但是,每次我嘗試再次檢索該blob時,都會發生同樣的問題。 所有周圍的斑點都會返回正常。有問題的斑點很好,可以使用其他設備進行檢索。

我花了很多時間清除所涉及的所有變量,並回顧了所討論的blob,無論返回的只有749個字節。從設備上刪除應用程序並重新安裝它是唯一的解決方法!

所以我認爲Azure存儲或移動服務認爲返回的數據是可以的(因爲它沒有錯誤)並且一直髮送相同的數據 - 我如何防止並要求真正的重試?

低於實際檢索代碼爲github上的禮貌:謝謝Ajayi13這幾乎是真棒

[request fetchDataWithBlock:^(NSData* data, NSError* error) 
{ 
    if(error) 
    { 
     if(block) 
     { 
      block(nil, error); 
     } 
     else if([(NSObject*)_delegate respondsToSelector:@selector(storageClient:didFailRequest:withError:)]) 
     { 
      [_delegate storageClient:self didFailRequest:request withError:error]; 
     } 
     return; 
    } 

    if(block) 
    { 
     block(data, nil); 
    } 
    else if([(NSObject*)_delegate respondsToSelector:@selector(storageClient:didGetBlobData:blob:)]) 
    { 
     [_delegate storageClient:self didGetBlobData:data blob:blob]; 
    } 
}]; 

我現在已經添加基於AdamSorrin的響應下面的代碼和博客文章由丹尼爾PASCO:https://blackpixel.com/writing/2012/05/caching-and-nsurlconnection.html

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { 

NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)[cachedResponse response]; 

    // Look up the cache policy used in our request 
    if([connection currentRequest].cachePolicy == NSURLRequestUseProtocolCachePolicy) { 
     NSDictionary *headers = [httpResponse allHeaderFields]; 
     NSString *cacheControl = [headers valueForKey:@"Cache-Control"]; 
     NSString *expires = [headers valueForKey:@"Expires"]; 
     if((cacheControl == nil) && (expires == nil)) { 
      NSLog(@"server does not provide expiration information and we are using NSURLRequestUseProtocolCachePolicy"); 
      return nil; // don't cache this 
     } 
    } 
    return nil; 
} 

但這並沒有固定我的問題:O(

+0

你能鏈接到你正在使用的GitHub代碼,或將其包含在問題中嗎? –

+0

嗨lindydonna,我使用的一些代碼可以在https://github.com/Ajayi13/BlobExample-Swift找到。謝謝 – Pinwheeler

回答

1

我不確定你使用的網絡庫(你的請求對象)到底是什麼,所以我會假設它基於NSURLSession和NSURLRequest。如果不是,這裏的細節將是錯誤的,但潛在的原因仍然可能是正確的。

我猜你的問題是雙重的。

  • 對於NSURLSession downloadTaskWithRequest:completionHandler:,傳遞到完成處理程序塊中的NSError參數僅在客戶端錯誤設定。在客戶端上沒有檢測到可重試的服務端錯誤(throttting,服務器繁忙等) - 您需要查看HTTP response code /消息並進行適當的處​​理。

  • 看看NSURLSessionConfiguration文檔,特別是requestCachePolicy。我的猜測是,當您嘗試重新獲取blob的內容時,您會從緩存中獲取過時的數據。如果這確實導致問題,您可以使用此參數強制請求重新從服務中獲取數據。

+0

感謝亞當..........我現在會閱讀這些內容 - 但是,我一直在想某種緩存不斷被反覆返回,這樣纔有意義。讓我檢查一下並儘快回覆。 – Pinwheeler

+0

謝謝你。 事實上,我認爲我已經根據你的想法修復了一段時間......。但沒有令人失望的不...... 因此 - 我正在使用NSURLConnection,並感謝你的一些博客文章,我添加了代碼來捕獲緩存策略和中斷,以防止項目被緩存。 但仍然一旦展示問題(當我得到749字節)時,重新獲取仍然會繼續返回749字節。 grrrrrrr – Pinwheeler

+0

PS:HTTP響應代碼說'狀態碼:200',所以沒有問題 – Pinwheeler

相關問題