如何在状态栏中指示网络活动

问题描述:

我在我的iOS应用程序中使用Alamofire进行网络连接。我需要在iOS 7+中运行此应用程序。我想显示状态栏网络活动,所以我创造了这个结构:如何在状态栏中指示网络活动

struct ActivityManager { 

    static var activitiesCount = 0 

    static func addActivity() { 
     if activitiesCount == 0 { 
      UIApplication.sharedApplication().networkActivityIndicatorVisible = true 
     } 

     activitiesCount++ 
    } 

    static func removeActivity() { 
     if activitiesCount > 0 { 
      activitiesCount-- 

      if activitiesCount == 0 { 
       UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
      } 
     } 
    } 

} 

但我不知道,哪里的代码addActivity()removeActivity()方法调用。我不想写每一个请求。我想,他们会在每次请求时自动调用。

我也试过用纯NSURLSessionNSURLSessionTask和扩展它们:

extension NSURLSessionTask { 

    func resumeWithActivity() { 
     ActivityManager.addAction() 
     self.resume() 
    } 

} 


public extension NSURLSession { 

    func OwnDataTaskWithRequest(request: NSURLRequest!, ownCompletionHandler: ((NSData!, NSURLResponse!, NSError!) -> Void)?) -> NSURLSessionDataTask! { 

     return self.dataTaskWithRequest(request, completionHandler: { (data, response, error) in 
      ActivityManager.removeAction() 
      ownCompletionHandler!(data, response, error) 
     }) 
    } 

} 

然后我用他们这样的:

var session: NSURLSession = NSURLSession(configuration: config, delegate: self, delegateQueue: nil) 

session.OwnDataTaskWithRequest(request) { (data, response, error) -> Void in 
    // some logic here    
}.resumeWithActivity() 

但这种方法是行不通的。在iOS 7中是NSURLSession扩展名不可见。我为此创建了一个bug report(与sample project)。

你能否给我一些建议,如何达到我的目标?有或没有Alamofire?

如果您不想为每个请求手动调用您的函数,并且您想要使用Alamofire,我建议您改进它以添加网络活动指示器功能。

看一看在source of Alamofire

你需要在你的ActivityManager注册2通知观察者,然后在无论是在Alamofire.Manager或Alamofire.Request相关地方触发通知。

另请参阅source of AFNetworkActivityIndicatorManager,其中实现了AFNetworking所需的功能。