Ios Alamofire请求发出内存警告
我正在使用一个主细节应用程序。主屏幕是一个仪表板,在选择一个项目时,移动到详细屏幕,在那里我在后端触发一个Ios Alamofire请求发出内存警告,ios,swift,memory-management,memory-leaks,alamofire,Ios,Swift,Memory Management,Memory Leaks,Alamofire,我正在使用一个主细节应用程序。主屏幕是一个仪表板,在选择一个项目时,移动到详细屏幕,在那里我在后端触发一个Alamofire请求 下面是片段 class APIManager: NSObject { class var sharedManager: APIManager { return _sharedManager } private var requests = [Request]() // Cancel any ongoing down
Alamofire
请求
下面是片段
class APIManager: NSObject {
class var sharedManager: APIManager {
return _sharedManager
}
private var requests = [Request]()
// Cancel any ongoing download
func cancelRequests() {
if requests.count > 0 {
for request in requests {
request.cancel()
}
}
}
func getData(completion: (dataSet: [Data]?, error: NSError?) -> Void) {
let request = Alamofire.request(.GET, "http://request")
.response { (request, response, data, error) in
dispatch_async(dispatch_get_main_queue(), {
if(error == nil) {
if let response = data, data = (try? NSJSONSerialization.JSONObjectWithData(response, options: [])) as? [NSDictionary] {
var dataSet = [Data]()
for (_, dictionary) in data.enumerate() {
let lat = dictionary["Latitude"]
let lng = dictionary["Longitude"]
let id = dictionary["ID"] as! Int
let data = Data(lat: lat!, long: lng!, id: shuttleID)
dataSet.append(data)
}
completion(dataSet: dataSet, error: nil)
}
} else { completion(dataSet: nil, error: error) }
})
}
requests.append(request)
}
}
我有一个单例API管理器类,并从详细视图控制器调用getData()
函数。一切正常
但是,当我反复按下并弹出时,我看到内存迅速增加,在尝试10-15次后,我收到内存警告。但是,在AppDelegate
中,我正在管理它以显示一条警报消息,并添加一个8秒的延迟计时器。但在20-25次尝试后,由于内存警告,应用程序崩溃
在视图将消失()
中,我也会取消任何正在进行的请求。但我无法阻止内存警告问题。我对调用请求的部分进行了注释,没有发现任何问题,甚至内存消耗更少
我欢迎您的想法。问题是您从未删除附加到成员变量“requests”的请求 您需要确保在取消请求或请求成功完成时删除该请求 执行以下修改-
func cancelRequests() {
if requests.count > 0 {
for request in requests {
request.cancel()
}
}
requests.removeAll() //Delete all canseled requests
}
also
func getData(completion: (dataSet: [Data]?, error: NSError?) -> Void) {
let request = Alamofire.request(.GET, "http://request")
.response { (request, response, data, error) in
dispatch_async(dispatch_get_main_queue(), {
if(error == nil) {
if let response = data, data = (try? NSJSONSerialization.JSONObjectWithData(response, options: [])) as? [NSDictionary] {
var dataSet = [Data]()
for (_, dictionary) in data.enumerate() {
let lat = dictionary["Latitude"]
let lng = dictionary["Longitude"]
let id = dictionary["ID"] as! Int
let data = Data(lat: lat!, long: lng!, id: shuttleID)
dataSet.append(data)
}
requests.removeObject(request)
completion(dataSet: dataSet, error: nil)
}
} else {
requests.removeObject(request)
completion(dataSet: nil, error: error) }
})
}
requests.append(request)
}
在数组上添加此方便的扩展,以删除代码中的项:
// Swift 2 Array Extension
extension Array where Element: Equatable {
mutating func removeObject(object: Element) {
if let index = self.indexOf(object) {
self.removeAtIndex(index)
}
}
mutating func removeObjectsInArray(array: [Element]) {
for object in array {
self.removeObject(object)
}
}
}
通过分析,我发现内存警告不是由
Alamofire
请求引起的。这是由于MKMapView
。加载MKMapView
,放大和缩小会消耗更多内存。因此,在视图中将消失
中,我进行了修复
override func viewWillDisappear(animated:Bool){
super.viewWillDisappear(animated)
self.applyMapViewMemoryFix()
}
func applyMapViewMemoryFix(){
switch (self.mapView.mapType) {
case MKMapType.Hybrid:
self.mapView.mapType = MKMapType.Standard
break;
case MKMapType.Standard:
self.mapView.mapType = MKMapType.Hybrid
break;
default:
break;
}
self.mapView.showsUserLocation = false
self.mapView.delegate = nil
self.mapView.removeFromSuperview()
self.mapView = nil
}
礼貌-