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

时间:2014-09-25 22:46:25

标签: nsurlsession nsurlsessiontask alamofire

我在我的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?

1 个答案:

答案 0 :(得分:1)

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

查看source of Alamofire

您需要在ActivityManager中注册2个通知观察者,然后在Alamofire.Manager或Alamofire.Request中的相关位置触发通知。

另请查看在{AFNetworking中实现所需功能的source of AFNetworkActivityIndicatorManager