iOS – Objective-C – 小部件文本和图像加倍 – 旧数据不会被清除

iOS – Objective-C – 小部件文本和图像加倍 – 旧数据不会被清除,第1张

概述在iOS应用程序小部件中,我只能在某些设备上看到双倍的数据(见下图).我试图识别设备,iOS版本,但它似乎是“随机的”.另外,我自己无法对此进行调试,因为在我的每个设备上,所有设备都正确呈现并且盲目调试无法正常工作(AppStore上的多次更新但仍然存在相同的错误). 在小部件中,我从Web下载(在后台线程中)新数据并将它们(在dispatch_get_main_queue()中)放入标签,图像 在iOS应用程序小部件中,我只能在某些设备上看到双倍的数据(见下图).我试图识别设备,iOS版本,但它似乎是“随机的”.另外,我自己无法对此进行调试,因为在我的每个设备上,所有设备都正确呈现并且盲目调试无法正常工作(AppStore上的多次更新但仍然存在相同的错误).

在小部件中,我从Web下载(在后台线程中)新数据并将它们(在dispatch_get_main_queue()中)放入标签,图像等中.一切正常,但有时旧数据不会被“清除”.在我的小部件设计文件中,我已经清除了所有“默认”文本,所以这不是这个问题.

加倍图标&文本4.1°C和7.9°C是重叠的

我的小部件代码的主要部分是(通过删除其他标签,表格和地理位置缩短):

- (voID)vIEwDIDLoad{    [super vIEwDIDLoad];    if ([self.extensionContext respondsToSelector:@selector(WidgetLargestAvailabledisplayMode)])    {        //this is iOS >= 10                        self.extensionContext.WidgetLargestAvailabledisplayMode = NCWidgetdisplayModeExpanded;    }    [[NSNotificationCenter defaultCenter] addobserver:self selector:@selector(FinishDownload:) name:@"FinishDownload" object:nil];    self.preferredContentSize = CGSizeMake(320,160);     [self updateData];}-(voID)vIEwDIDAppear:(BOol)animated{    [super vIEwDIDAppear:animated];    [self updateData];}-(voID)vIEwWillAppear:(BOol)animated{    [super vIEwWillAppear:animated];    [self updateData];}-(voID)updateData{    [[[DataManager SharedManager] settings] Reload];    [[CoreDataManager SharedManager] reset];    if ([[DataManager SharedManager] DownloadDataWithAfterSelector:@"FinishDownload"] == NO)        {            //no need to download update - refill data Now            //if downloading - wait for download            [self FillData];        }    }}-(voID)FinishDownload:(NSNotification *)notification{    dispatch_async(dispatch_get_main_queue(),^{        [self FillData];    });}-(voID)FillData{    //a lot of code - example of setting temperature    Nsstring *str = [Nsstring stringWithFormat:@"%@ °C",act.temp_act];    self.lblTemp.text = str;    [self.lblTemp sizetoFit];    if (self.completionHandler != nil)    {        self.completionHandler(NCUpdateResultNewData);    }}- (voID)WidgetPerformUpdateWithCompletionHandler:(voID (^)(NCUpdateResult))completionHandler{    // Perform any setup necessary in order to update the vIEw.    // If an error is encountered,use NCUpdateResultFailed    // If there's no update required,use NCUpdateResultNoData    // If there's an update,use NCUpdateResultNewData    //completionHandler(NCUpdateResultNewData);    NSLog(@"=== WidgetPerformUpdateWithCompletionHandler === ");    self.completionHandler = completionHandler;    [self updateData];}- (UIEdgeInsets)WidgetmarginInsetsForProposedmarginInsets:(UIEdgeInsets)defaultmarginInsets{    return UIEdgeInsetsMake(0,5,5);}- (voID)WidgetActivedisplayModeDIDChange:(NCWidgetdisplayMode)activedisplayMode withMaximumSize:(CGSize)maxSize{    if (activedisplayMode == NCWidgetdisplayModeExpanded)    {        self.preferredContentSize = CGSizeMake(320,160);                }    else if (activedisplayMode == NCWidgetdisplayModeCompact)    {        self.preferredContentSize = maxSize;                }}
解决方法 >查看生命周期

不要在vIEwDIDLoad和vIEwWillAppear / vIEwDIDAppear中复制工作.
已加载的视图将触及所有三种方法.使用vIEwDIDLoad进行必须在UIVIEwController的生命周期内执行一次的 *** 作.
潜在问题:
可能使用竞争的NCUpdateResult完成处理程序3,将[self updateData]的3个调用(可能会发生冲突)重新触发.
>平衡观察员

似乎addobserver永远不会被removeObserver平衡.这些注册方法的一个好位置是一组平衡消息,例如vIEw___Appear和vIEw___disappear方法,如StackOverflow answer中所述.
潜在问题:
持久注册可能超出范围的对象的通知.
>不要缓存OS处理程序

可能滥用NCUpdateResultNewData完成处理程序:将NCUpdateResult传递给WidgetPerformUpdateWithCompletionHandler以用于该特定调用,而不是存储以供多次重用.它可能应该传递给updateData作为参数而不是存储在全局中,然后传递给FillData,并最终在一次性使用后被清除.

if (nil != self.completionHandler) {    self.completionHandler(NCUpdateResultNewData);    self.completionHandler = nil; // One time use}

每个对WidgetPerformUpdateWithCompletionHandler的调用都有自己的循环,如this StackOverflow answer所述.
>布局&自动布局

请注意,iOS正在制作小部件的快照;在Interface Builder中,确保使用适当的视图分层.特别注意透明度和绘制标志.利用autolayout调整对象的大小/大小/捕捉

总结

以上是内存溢出为你收集整理的iOS – Objective-C – 小部件文本和图像加倍 – 旧数据不会被清除全部内容,希望文章能够帮你解决iOS – Objective-C – 小部件文本和图像加倍 – 旧数据不会被清除所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1051102.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存