xcode 网络活动指示器可见

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3032192/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 19:27:21  来源:igfitidea点击:

networkActivityIndicatorVisible

iphonexcode

提问by teo

Is this code correct to use with the networkActivityIndicatorVisible?

此代码与 networkActivityIndi​​catorVisible 一起使用是否正确?

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    UIApplication* app2 = [UIApplication sharedApplication]; 
    app2.networkActivityIndicatorVisible = YES; 
    [self loadSources];  // Loads data in table view
    app2.networkActivityIndicatorVisible = NO; 
}

Teo

特奥

回答by Jano

Since NetworkActivityIndicatorVisiblecan be set from several points while a connection is still active, you need to track the number of calls that enable/disable it. The following UIApplicationcategory does just that using a static variable:

由于NetworkActivityIndicatorVisible可以在连接仍处于活动状态时从多个点进行设置,因此您需要跟踪启用/禁用它的呼叫数量。以下UIApplication类别仅使用静态变量执行此操作:

// file UIApplication+NetworkActivity.h
@interface UIApplication (NetworkActivity)
- (void)showNetworkActivityIndicator;
- (void)hideNetworkActivityIndicator;
@end

// file UIApplication+NetworkActivity.m
#import "UIApplication+NetworkActivity.h"
static NSInteger activityCount = 0;
@implementation UIApplication (NetworkActivity)
- (void)showNetworkActivityIndicator {
    if ([[UIApplication sharedApplication] isStatusBarHidden]) return;
    @synchronized ([UIApplication sharedApplication]) {
        if (activityCount == 0) {
            [self setNetworkActivityIndicatorVisible:YES];
        }
        activityCount++;
    }
}
- (void)hideNetworkActivityIndicator {
    if ([[UIApplication sharedApplication] isStatusBarHidden]) return;
    @synchronized ([UIApplication sharedApplication]) {
        activityCount--;
        if (activityCount <= 0) {
            [self setNetworkActivityIndicatorVisible:NO];
            activityCount=0;
        }    
    }
}
@end

Now import UIApplication+NetworkActivity.hin your client code and call

现在导入UIApplication+NetworkActivity.h您的客户端代码并调用

// on connection started:
[[UIApplication sharedApplication] showNetworkActivityIndicator];

// on connection finished:
[[UIApplication sharedApplication] hideNetworkActivityIndicator];

If your concern is that the indicator blinks for only a second, you don't need a background process. Just call [self performSelector:@selector(loadSources) withObject:Nil afterDelay:0.1]so the UI thread has time to start the network indicator animation before you block the main thread.

如果您担心指示灯只闪烁一秒钟,则不需要后台进程。只需调用,[self performSelector:@selector(loadSources) withObject:Nil afterDelay:0.1]这样 UI 线程就有时间在阻塞主线程之前启动网络指示器动画。

回答by timonroe

If you're not using AFNetworking (https://github.com/AFNetworking/AFNetworking) already you can check out their network activity indicator implementation in AFNetworkingActivityIndicatorManager.

如果您还没有使用 AFNetworking ( https://github.com/AFNetworking/AFNetworking),您可以在 AFNetworkingActivityIndi​​catorManager 中查看他们的网络活动指示器实现。

If you do choose to use this library for your network access, they handle the network activity indicator for you automatically. All you need to do is make one call in your AppDelegate to set it up, they do the rest of the work for you.

如果您选择使用此库进行网络访问,它们会自动为您处理网络活动指示器。你需要做的就是在你的 AppDelegate 中打一个电话来设置它,他们会为你完成剩下的工作。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
}

回答by Kasper Sylvester Hansen

An shorter solution for tracking multiple activities - again using a UIApplication category and a static variable:

跟踪多个活动的更短的解决方案 - 再次使用 UIApplication 类别和静态变量:

@interface UIApplication (NetworkActivityIndicator)
    - (void)toggleNetworkActivityIndicatorVisible:(BOOL)visible;
@end

@implementation UIApplication (NetworkActivityIndicator)
-(void)toggleNetworkActivityIndicatorVisible:(BOOL)visible {
    static int activityCount = 0;
    @synchronized (self) {
        visible ? activityCount++ : activityCount--;
        self.networkActivityIndicatorVisible = activityCount > 0;
    }
}
@end

回答by teo

I finally solved it. I used performSelectorInBackgroundto execute the load data into tableView

我终于解决了。我曾经performSelectorInBackground将加载数据执行到 tableView

-(void)beginLoadSources {
    [self loadSources];  // Loads data in table view
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self performSelectorInBackground:@selector(beginLoadSources) withObject:nil];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
}

回答by MSinga Pro

Use thins code in your ExempleUIWebView.m before - (void)viewDidLoad

之前在您的 ExempleUIWebView.m 中使用 Thins 代码 - (void)viewDidLoad

  • (void)webViewDidFinishLoad:(UIWebView *)webView { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; [ProgressHUD dismiss]; } and use this after - (void)viewDidLoad
  • (void)webViewDidFinishLoad:(UIWebView *)webView { [UIApplication sharedApplication].networkActivityIndi​​catorVisible = NO; [ProgressHUD 关闭]; 并在 - (void)viewDidLoad 之后使用它

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; [ProgressHUD show:@"Loading Privacy Policy" Interaction:NO];

[UIApplication sharedApplication].networkActivityIndi​​catorVisible = YES; [ProgressHUD show:@"Loading Privacy Policy" Interaction:NO];