【问题标题】:networkActivityIndicatorVisiblenetworkActivityIndi​​catorVisible
【发布时间】:2010-06-13 12:19:29
【问题描述】:

此代码与 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; 
}

【问题讨论】:

  • 您提出此问题违反了您与 Apple 的开发者协议。目前,iOS 4 处于测试阶段,在 Apple 的网站上,他们说,“iPhone SDK 4 GM 种子、iOS 4 GM 种子和 iTunes 9.2 测试版是预发布软件,被视为 Apple 机密信息。”虽然我个人讨厌这样做,因为它阻碍了开发人员,但我确实尊重它。
  • 我没有意识到这一点。我只是更改帖子,如果那不好,我会删除它。谢谢

标签: iphone xcode


【解决方案1】:

由于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

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

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

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

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

【讨论】:

  • 这看起来不错。我想指出它可能应该是线程安全的,因为用户经常希望从后台调用它。
  • 对于 iOS 4.0 及更高版本,使用 libdispatchNSOperation 进行异步后台任务,而不是 performSelector:
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    跟踪多个活动的更短的解决方案 - 再次使用 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
    

    【讨论】:

    • 这不是让计数变为负数吗?
    【解决方案4】:

    我终于解决了。我使用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; 
    }
    

    【讨论】:

      【解决方案5】:

      在您的 ExampleUIWebView.m 中使用精简代码 之前 - (void)viewDidLoad

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        • 1970-01-01
        • 1970-01-01
        • 2015-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多