簡體   English   中英

修復我的網絡活動指示器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM