在小部件中,我从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 – 小部件文本和图像加倍 – 旧数据不会被清除所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)