Форум программистов, компьютерный форум CyberForum.ru

Мутирование массива - Swift - Swift

Войти
Регистрация
Восстановить пароль
 
Kennedy_SK
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 20
11.08.2015, 15:27     Мутирование массива - Swift #1
Доброго времени суток!
Столкнулся с проблемой, которую уже 3й день не могу решить:
Я отправляю запрос на сервер, и получаю данные, которые записываю в массив и вывожу на картку MapKit
т.е. есть "плавающие" аннотации.
Мой запрос к серверу выполняется таймером.

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
import UIKit
import MapKit
import CoreLocation
import AVFoundation
 
class AnnotationData: MKPointAnnotation {
    var status: String!
    var img: UIImage!
}
 
class Map: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate, OrderCancel, WaitCar, DriverInfo{
    // MARK - Variab.
    var locationManager = CLLocationManager()
    var data = GlobalData()
    var json = Json()
    var posClass = Position()
    var addr = Address()
    let regionRadius: CLLocationDistance = 1000
    var id: String = ""
    var check = true
    var checkdone = false
    var timer1 = NSTimer()
    var name: Array<String> = []
    var lon: Array<String> = []
    var longitude = []
    var lat: Array<String> = []
    var latitude = []
    var st: Array<String> = []
    var status: Array<String> = []
 
    
    //MARK - viewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()
        backgroundColor()
        locationManager.delegate = self
        myMap.delegate = self
        myMap.showsUserLocation = true
        self.json.ordCancel = self
        self.json.wait = self
        self.json.driverdelegate = self
        var start_coord = CLLocationCoordinate2D(latitude: data.start_latitude, longitude: data.start_longitude)
        if (locationManager.location != nil) {
            let coord = MKCoordinateRegionMakeWithDistance(locationManager.location.coordinate, regionRadius * 8.0, regionRadius * 8.0)
            myMap.setRegion(coord, animated: true)
        } else {
            let coord = MKCoordinateRegionMakeWithDistance(start_coord, regionRadius * 8.0, regionRadius * 8.0)
            myMap.setRegion(coord, animated: true)
        }
        timer1 = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: Selector("GoData"), userInfo: nil, repeats: true)
        
    }
    
    //MARK - Request\use with timer ->
    func GoData () {
        json.URLDriver()
    }
 
    //MARK - Driver data
    func DriverData(string: String) {
//        println(string)
        if (string != "<s><br></s>") {
            var start = find(string, "n")
            let pos = distance(string.startIndex, start!)
            var newstr = string.substringFromIndex(advance(string.startIndex, pos + 6))
            var end = find(newstr, "/")
            let posend = distance(newstr.startIndex, end!)
            var nnstr = newstr.substringToIndex(advance(newstr.startIndex, posend - 5))
            var namearr: Array<String> = nnstr.componentsSeparatedByString("<br>")
            name = namearr.map { $0.substringToIndex(advance(find($0,"|")!, 0))}
            lon = namearr.map { $0.substringFromIndex(advance(find($0,"|")!, 1))}
            longitude = lon.map { $0.substringToIndex(advance(find($0,"|")!, 0))}
            lat = lon.map { $0.substringFromIndex(advance(find($0,"|")!, 1))}
            latitude = lat.map { $0.substringToIndex(advance(find($0,"|")!, 0))}
            st = lat.map { $0.substringFromIndex(advance(find($0,"|")!, 1))}
            status = st.map { $0.substringToIndex(advance(find($0,"|")!, 0))}
            
            var annotations: Array<AnyObject> = []
            var i = 0
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
                var annotation = NSMutableArray()
                self.myMap.removeAnnotations(self.myMap.annotations)
                do {
                    var ann = AnnotationData()
                    
                    var coord: CLLocationCoordinate2D = CLLocationCoordinate2DMake(self.longitude[i].doubleValue, self.latitude[i].doubleValue)
                    var point: CGPoint!
                    var text: String!
                    ann.coordinate = coord
                    switch (count(self.name[i])) {
                    case 1:
                        text = self.name[i]
                        point = CGPointMake(22, 12.8)
                        break
                    case 2:
                        text = self.name[i]
                        point = CGPointMake(19.6, 12.8)
                        break
                    default:
                        text = self.name[i]
                        point = CGPointMake(16.5, 12.8)
                        break
                    }
                    switch (self.status[i]) {
                    case "1":
                        ann.status = "1.png"
                        ann.img = self.text(text, inImage: UIImage(named: "1.png")!, atPoint: point)
                        break
                    case "2":
                        ann.status = "2.png"
                        ann.img = self.text(text, inImage: UIImage(named: "2.png")!, atPoint: point)
                        break
                    default:
                        ann.status = "3.png"
                        ann.img = self.text(text, inImage: UIImage(named: "3.png")!, atPoint: point)
                        break
                    }
                    //                        self.myMap.addAnnotation(ann)
                    annotations.append(ann)
                    i++
//                    if (i == namearr.count) {
//                        namearr.removeAll(keepCapacity: false)
//                    }
                    
                } while (i < namearr.count)
                dispatch_async(dispatch_get_main_queue(), {
        
                    self.myMap.addAnnotations(annotations)
                })
            })
        } else {
            println("No car")//alert make
            timer1.invalidate()
        }
    }
    
    //MARK - Рисуем текст, который получаем при запросе, рисуем на картинку
    func text (drawText: NSString, inImage: UIImage, atPoint: CGPoint) -> UIImage {
        var textcolor: UIColor = UIColor.blackColor()
        var textfont: UIFont = UIFont(name: "Helvetica Bold", size: 10)!
        UIGraphicsBeginImageContext(inImage.size)
        let textattr = [NSFontAttributeName: textfont, NSForegroundColorAttributeName: textcolor]
        inImage.drawInRect(CGRectMake(0, 0, inImage.size.width, inImage.size.height))
        var rect: CGRect = CGRectMake(atPoint.x, atPoint.y, inImage.size.width, inImage.size.height)
        drawText.drawInRect(rect, withAttributes: textattr)
        var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }
 
    //MARK - Map View ->
    func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
        let reuseID = "user_loc" //конкретная картинка для UserLocation
        var anView = myMap.dequeueReusableAnnotationViewWithIdentifier(reuseID) as? MKPinAnnotationView
        if (annotation is MKUserLocation) {
            anView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseID)
            anView!.image = UIImage(named: "usrlc.jpg")
            anView!.canShowCallout = true
            return anView!
        }
        
        let annData = annotation as! AnnotationData
        let reuseId = "pin"
        anView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        if anView == nil {
            anView!.image = annData.img
            anView!.canShowCallout = true
        } else {
            anView!.image = annData.img
            anView!.canShowCallout = true
        }
            return anView
    }
    
    //MARK - Location Manager (user location) ->
    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {      
        let location = CLLocationCoordinate2D(latitude: manager.location.coordinate.latitude, longitude: manager.location.coordinate.longitude)
        let coord = MKCoordinateRegionMakeWithDistance(location, regionRadius * 2.0, regionRadius * 2.0)
        myMap.setRegion(coord, animated: true)
 
    }
    
    //MARK - Error of search loc. data -??
    func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
//        println("Координаты не определены")
        alertError()
    }
    
    //->
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
Работает все хорошо, НО вылетает ошибка (может вылететь через час использования программы, а может вылететь сразу)
Collection was mutated while being enumerated.
Т.е. он изменился пока перечислялся, как мне избавится от этого?
заранее спасибо!
Миниатюры
Мутирование массива - Swift  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,270
11.08.2015, 21:23     Мутирование массива - Swift #2
вы сами ответили на свой вопрос: не изменять массив, пока идете по нему - очевидно ж
Kennedy_SK
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 20
11.08.2015, 23:46  [ТС]     Мутирование массива - Swift #3
Цитата Сообщение от Vorona Посмотреть сообщение
вы сами ответили на свой вопрос: не изменять массив, пока идете по нему - очевидно ж
а как правильно сделать, что бы он не менялся?)
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,270
12.08.2015, 11:57     Мутирование массива - Swift #4
изменение массива - добавление\удаление его элементов
Kennedy_SK
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 20
12.08.2015, 11:59  [ТС]     Мутирование массива - Swift #5
Цитата Сообщение от Vorona Посмотреть сообщение
изменение массива - добавление\удаление его элементов
так я пробовал чистить массив:
Objective-C
1
2
3
                  if (i == namearr.count) {
                        namearr.removeAll(keepCapacity: false)
                   }
в итоге все равно не пашет...я просто уже не знаю что и делать...проблема, которая не дает возможности запустить приложение в AppStore)
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
12.08.2015, 12:14     Мутирование массива - Swift #6
Что значит "не знаю что и делать"? Вам же прямо говорят: не изменять массив, когда идет энумерация.
Для начала бы хоть написали 0x7fe3ccc38c00 - это который из массивов в коде?
Kennedy_SK
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 20
12.08.2015, 13:41  [ТС]     Мутирование массива - Swift #7
Цитата Сообщение от glvrzzz Посмотреть сообщение
Для начала бы хоть написали 0x7fe3ccc38c00 - это который из массивов в коде?
который:
Objective-C
1
var namearr: Array<String> = nnstr.componentsSeparatedByString("<br>")
Добавлено через 1 час 10 минут
суть в том, что ошибка выскакивает, когда я перемещаю карту...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2015, 15:25     Мутирование массива - Swift
Еще ссылки по теме:

Конвертер из swift в ObjC Swift
Swift Swift is open source!
Swift Казалось бы просто Swift
Swift JSON Parsing Swift
Сильная связь Swift Swift

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kennedy_SK
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 20
13.08.2015, 15:25  [ТС]     Мутирование массива - Swift #8
Решил проблему!
Добавление метода:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
func mapView (mapView: MKMapView!, regionWillChangeAnimated animated: Bool) {
UpdateAnnotaion()
}
 
func UpdateAnnotation () {
var oldAnnotation = self.myMap.annotations
do {
                    var ann = AnnotationData()
                    
                    var coord: CLLocationCoordinate2D = CLLocationCoordinate2DMake(self.longitude[i].doubleValue, self.latitude[i].doubleValue)
                    var point: CGPoint!
                    var text: String!
                    ann.coordinate = coord
                    switch (count(self.name[i])) {
                    case 1:
                        text = self.name[i]
                        point = CGPointMake(22, 12.8)
                        break
                    case 2:
                        text = self.name[i]
                        point = CGPointMake(19.6, 12.8)
                        break
                    default:
                        text = self.name[i]
                        point = CGPointMake(16.5, 12.8)
                        break
                    }
                    switch (self.status[i]) {
                    case "1":
                        ann.status = "1.png"
                        ann.img = self.text(text, inImage: UIImage(named: "1.png")!, atPoint: point)
                        break
                    case "2":
                        ann.status = "2.png"
                        ann.img = self.text(text, inImage: UIImage(named: "2.png")!, atPoint: point)
                        break
                    default:
                        ann.status = "3.png"
                        ann.img = self.text(text, inImage: UIImage(named: "3.png")!, atPoint: point)
                        break
                    }
                    self.myMap.addAnnotation(ann)
                    i++
    
                } while (i < self.namearr.count)
self.myMap.removeAnnotations(oldAnnotation)
}
Yandex
Объявления
13.08.2015, 15:25     Мутирование массива - Swift
Ответ Создать тему
Опции темы

Текущее время: 16:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru