ios – 修复我的网络活动指标

ios – 修复我的网络活动指标,第1张

概述我的网络活动指示器有问题,有时它会在不应该显示时继续显示. 我为它编写了自己的经理并将其换成了一个使用NSAssert语句的人… - (void)setNetworkActivityIndicatorVisible:(BOOL)setVisible { static NSInteger NumberOfCallsToSetVisible = 0; if (setVisible) 我的网络活动指示器有问题,有时它会在不应该显示时继续显示.

我为它编写了自己的经理并将其换成了一个使用NSAssert语句的人…

- (voID)setNetworkActivityIndicatorVisible:(BOol)setVisible {    static NSInteger NumberOfCallsToSetVisible = 0;    if (setVisible)        NumberOfCallsToSetVisible++;    else        NumberOfCallsToSetVisible--;    // The assertion helps to find programmer errors in activity indicator management.    // Since a negative NumberOfCallsToSetVisible is not a Fatal error,// it should probably be removed from production code.    NSAssert(NumberOfCallsToSetVisible >= 0,@"Network Activity Indicator was asked to hIDe more often than shown");    // display the indicator as long as our static counter is > 0.    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:(NumberOfCallsToSetVisible > 0)];}

我在SO上发现了它,它立即指出我使用这个功能出了问题.

我的所有网络活动都是通过一个由单例类管理的NSOperationQueue专门运行的.每个 *** 作都是NSOperation的子类(实际上是TemplateOperation的子类,它是NSOperation的子类).

无论如何,所有的下载和上传工作正常,我这样做就像这样……

- (voID)sendRequest:(NSURLRequest *)request{    NSError *error = nil;    NSURLResponse *response = nil;    [[NetworkManager sharedInstance] setNetworkActivityIndicatorVisible:YES];    NSData *data = [NSURLConnection sendSynchronousRequest:request                                         returningResponse:&response                                                     error:&error];    [[NetworkManager sharedInstance] setNetworkActivityIndicatorVisible:NO];    // other stuff...    [self processData:data];}

重要的行是在我同步发送NSURLConnection之前和之后.

在我发送请求之前,我将网络活动指示器设置为可见(使用我的经理类),然后立即将其设置为不可见.

除了NSAssert指出,某些地方这种情况没有发生.

难道从多个线程运行此函数可能会导致问题吗?我该怎么解决这个问题?

解决方法 整数递增或递减不是线程安全的(据我所知),因此如果两个线程“同时”调用您的方法,则计数可能无法正确更新.

一种解决方案是添加一些同步指令(例如@synchronized)
你的方法.或者您使用原子递增/递减函数:

#include <libkern/OSAtomic.h>- (voID)setNetworkActivityIndicatorVisible:(BOol)setVisible {    static volatile int32_t NumberOfCallsToSetVisible = 0;    int32_t newValue = OSAtomicAdd32((setVisible ? +1 : -1),&NumberOfCallsToSetVisible);    NSAssert(newValue >= 0,@"Network Activity Indicator was asked to hIDe more often than shown");    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:(newValue > 0)];}
总结

以上是内存溢出为你收集整理的ios – 修复我的网络活动指标全部内容,希望文章能够帮你解决ios – 修复我的网络活动指标所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/web/1017674.html

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

发表评论

登录后才能评论

评论列表(0条)

保存