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

相关问题