4

我在我的 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扩展是不可见的。我为此创建了一个错误报告(带有示例项目)。

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

4

1 回答 1

1

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

看看Alamofire 的来源

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

还可以查看AFNetworkActivityIndi​​catorManager 的源代码,它实现了您在 AFNetworking 中想要的功能。

于 2014-09-29T06:39:18.267 回答