如何在状态栏中指示网络活动
问题描述:
我在我的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()
方法调用。我不想写每一个请求。我想,他们会在每次请求时自动调用。
我也试过用纯NSURLSession
和NSURLSessionTask
和扩展它们:
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,我建议您改进它以添加网络活动指示器功能。
你需要在你的ActivityManager注册2通知观察者,然后在无论是在Alamofire.Manager或Alamofire.Request相关地方触发通知。
另请参阅source of AFNetworkActivityIndicatorManager,其中实现了AFNetworking所需的功能。