![](/img/trans.png)
[英]Network activity indicator and beginBackgroundTaskWithExpirationHandler
[英]Fixing my network activity indicator
我的網絡活動指示器有問題,有時它會在不應該顯示時繼續顯示。
我為它編寫了自己的經理並將其換成了一個使用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)];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.