Xamarin.ios 如何在视图中使用FFImageLoading?
我想在顶部栏中显示UIImageView,其中包含url中的UIImage,然后将其缓存在我的iOS原生Xamarin iOS应用程序中。问题是,当添加到视图时,会出现FFImageLoading日志,显示图像被取消的次数约为10次中的9次,但偶尔会成功并显示。我使用:Xamarin.ios 如何在视图中使用FFImageLoading?,xamarin.ios,uiimageview,ffimageloading,Xamarin.ios,Uiimageview,Ffimageloading,我想在顶部栏中显示UIImageView,其中包含url中的UIImage,然后将其缓存在我的iOS原生Xamarin iOS应用程序中。问题是,当添加到视图时,会出现FFImageLoading日志,显示图像被取消的次数约为10次中的9次,但偶尔会成功并显示。我使用: ImageService.Instance.LoadUrl(url) .Retry(3, 200) .Into(avatarImag
ImageService.Instance.LoadUrl(url)
.Retry(3, 200)
.Into(avatarImage);
它要么第一次尝试成功,要么所有重试都失败。我也尝试了更长的重试延迟,但没有成功。如果我把代码放在ViewDidAppeal中,它会在10次中运行9次,但不总是,也不会在第一次加载时运行。如果我把它放在一个按钮中,我在视图加载后按下该按钮,图像总是成功加载。很明显,FFImageLoading失败了,因为UIImageView尚未绘制/加载,但由于我创建了UIImageView并将其添加到视图中,我不知道还能做什么
如何使用FFImageLoading可靠地加载图像?我可以预加载它,但这仍然不能解决如何在第一次显示它之前将其放入UIImageView中的问题。如果不可能,我愿意接受其他选择
日志:无法加载到UIImageView:
请参阅。这可能会有帮助
var taskImage = ImageService.Instance.LoadUrl(imageURL)
.ErrorPlaceholder("error.png", ImageSource.ApplicationBundle)
.LoadingPlaceholder("placeholder", ImageSource.CompiledResource);
if(transformation==0)
{
taskImage.Into(imageView);
transformation++;
}
else if(transformation==1)
{
taskImage.Transform(new CircleTransformation()).Into(imageView);
transformation++;
}
else if(transformation==2)
{
taskImage.Transform(new RoundedTransformation(10)).Into(imageView);
transformation = 0;
}
我一直无法理解为什么FFImageLoading会被取消,所以我使用了和HttpClient来滚动我自己的,我还使用它们来检查手机是否连接 每次显示“从视图更新”时,此选项都有效。因为我使用的是IObservable,所以在主UI线程(即InvokeOnMainThread)上更新映像非常重要 UrlImageView类,用于添加可从Url加载图像的UIView: IObserver类在检索图像数据时将触发OnNext
谢谢,我已经很久没看这个了,它证实了我做的一切都是正确的。我测试了将UIImage设置为null,但没有任何区别。因此,我对为什么图像没有加载到UIImageView中感到更加困惑。我已经添加了日志,以防这些日志泄露了什么。请注意,所有其他FFImageLoading图像都加载得很好-尽管它们是在后台线程上完成的,所以请稍后触发。@Tarostar尝试使用而不是FFImageLoading
[0:] FFImageLoadingDebug_Image loaded from cache: https://assets-cdn.github.com/images/modules/logos_page/Octocat.png;CircleTransformation,borderSize=0,borderHexColor=
[0:] FFImageLoadingDebug_Image loaded from cache: https://autodesk-forge.github.io/dist/sample.png?43fa010fd5f9a49ec978f5dec499349d
etc.
var taskImage = ImageService.Instance.LoadUrl(imageURL)
.ErrorPlaceholder("error.png", ImageSource.ApplicationBundle)
.LoadingPlaceholder("placeholder", ImageSource.CompiledResource);
if(transformation==0)
{
taskImage.Into(imageView);
transformation++;
}
else if(transformation==1)
{
taskImage.Transform(new CircleTransformation()).Into(imageView);
transformation++;
}
else if(transformation==2)
{
taskImage.Transform(new RoundedTransformation(10)).Into(imageView);
transformation = 0;
}
public class UrlImageView : UIImageView
{
private GetImageFromUrlObserver getImageFromUrlObserver = null;
public UrlImageView() : base()
{
getImageFromUrlObserver = new GetImageFromUrlObserver(this);
}
public void GetImageFromUrl(string url)
{
if (getImageFromUrlObserver != null)
{
getImageFromUrlObserver.GetImage(url);
}
}
public void Update(byte[] image)
{
this.InvokeOnMainThread(() =>
{
var data = NSData.FromArray(image);
this.Image = UIImage.LoadFromData(data);
});
}
}
public class GetImageFromUrlObserver : IObserver<byte[]>
{
private UrlImageView urlImageView;
private IDisposable unsubscriber;
public GetImageFromUrlObserver(UrlImageView view)
{
urlImageView = view;
}
public void GetImage(string url)
{
Subscribe(ImageLoader.GetImageFromUrl(url));
}
private void Subscribe(IObservable<byte[]> provider)
{
if (provider != null)
unsubscriber = provider.Subscribe(this);
}
public void OnCompleted()
{
Unsubscribe();
}
public void OnError(Exception error)
{
throw new NotImplementedException();
}
public void OnNext(byte[] image)
{
if (urlImageView != null)
{
urlImageView.Update(image);
}
}
private void Unsubscribe()
{
if (unsubscriber != null)
{
urlImageView = null;
unsubscriber.Dispose();
unsubscriber = null;
}
}
}
public static class ImageLoader
{
public static IObservable<byte[]> GetImageFromUrl(string url)
{
IObservable<byte[]> result = null;
var httpClient = new HttpClient(new NativeMessageHandler());
});
try
{
var cache = BlobCache.LocalMachine;
result = cache.GetAndFetchLatest(
url, /* simply use url as cache key */
async () =>
{
try
{
if (!CrossConnectivity.Current.IsConnected) return null;
HttpResponseMessage httpResponse = await httpClient.GetAsync(url);
return await httpResponse.Content.ReadAsByteArrayAsync().ConfigureAwait(false); ;
}
catch (Exception e)
{
EventTrackers.TrackException("GetImageFromUrl inner - " + e.Message);
return null;
}
},
offset =>
{
TimeSpan elapsed = DateTimeOffset.Now - offset;
return elapsed > new TimeSpan(hours: cacheUpdateFrequencyHours, minutes: cacheUpdateFrequencyMinutes, seconds: 0);
}
);
}
catch (Exception e)
{
EventTrackers.TrackException("GetImageFromUrl - " + e.Message);
return null;
}
return result;
}
UrlImageView image = new UrlImageView();
View.AddSubview(image);
image.GetImageFromUrl(url);