我的网络活动指示器有问题,有时它会在不应该显示的时候继续显示。
我为它写了我自己的经理,然后把它换成了一个使用这样的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 指出,这在某处没有正常发生。
难道是从多个线程运行这个函数可能会导致问题?我怎么能解决这个问题?