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

Swift

Войти
Регистрация
Восстановить пароль
 
kabudasay
3 / 3 / 1
Регистрация: 13.04.2015
Сообщений: 51
#1

PaseJSON - Swift - Выдает ошибку Error Domain=NSCocoaErrorDomain Code=3840 - Swift

17.07.2016, 16:59. Просмотров 757. Ответов 3
Метки нет (Все метки)

Пробую запостить сообщение с изображением в MySQL пых прилагается, помогите люди добрые !

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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
import UIKit
 
class PostVC: UIViewController, UITextViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    // UI obj
    @IBOutlet var textTxt: UITextView!
    @IBOutlet var countLbl: UILabel!
    @IBOutlet var selectBtn: UIButton!
    @IBOutlet var pictureImg: UIImageView!
    @IBOutlet var postBtn: UIButton!
    
    // unique id of post
    var uuid = String()
    var imageSelected = false
    
    
    // first func
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // round corners
        textTxt.layer.cornerRadius = textTxt.bounds.width / 50
        postBtn.layer.cornerRadius = postBtn.bounds.width / 20
        
        textTxt.backgroundColor = colorDefault
        
        // colors
        selectBtn.setTitleColor(colorDefault, forState: .Normal)
        selectBtn.backgroundColor = colorDefault
        selectBtn.tintColor = colorWhite
        postBtn.backgroundColor = colorDefault
        countLbl.textColor = colorGray
        
        // disable auto scroll layout
        self.automaticallyAdjustsScrollViewInsets = false
        
        // disable button from the begining
        postBtn.enabled = false
        postBtn.alpha = 0.4
        
    }
    
    
    // entered some text in TextView
    func textViewDidChange(textView: UITextView) {
        
        // numb of characters in textView
        let chars = textView.text.characters.count
        
        // white spacing in text
        let spacing = NSCharacterSet.whitespaceAndNewlineCharacterSet()
        
        // calculate string's length and convert to String
        countLbl.text = String(140 - chars)
        
        // if number of chars more than 140
        if chars > 140 {
            countLbl.textColor = colorSmoothRed
            postBtn.enabled = false
            postBtn.alpha = 0.4
            
            // if entered only spaces and new lines
        } else if textView.text.stringByTrimmingCharactersInSet(spacing).isEmpty {
            postBtn.enabled = false
            postBtn.alpha = 0.4
            
            // everything is correct
        } else {
            countLbl.textColor = colorGray
            postBtn.enabled = true
            postBtn.alpha = 1
        }
        
    }
    
    
    // touched screen
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        // hide keyboard
        self.view.endEditing(false)
    }
    
    
    // clicked select picture button
    @IBAction func select_click(sender: AnyObject) {
        
        // calling picker for selecting iamge
        let picker = UIImagePickerController()
        picker.delegate = self
        picker.sourceType = .PhotoLibrary
        picker.allowsEditing = true
        self.presentViewController(picker, animated: true, completion: nil)
    }
    
    
    // selected image in picker view
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        
        pictureImg.image = info[UIImagePickerControllerEditedImage] as? UIImage
        self.dismissViewControllerAnimated(true, completion: nil)
        
        // cast as a true to save image file in server
        if pictureImg.image == info[UIImagePickerControllerEditedImage] as? UIImage {
            imageSelected = true
        }
    }
    
    
    // custom body of HTTP request to upload image file
    func createBodyWithParams(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData {
        
        let body = NSMutableData();
        
        if parameters != nil {
            for (key, value) in parameters! {
                body.appendString("--\(boundary)\r\n")
                body.appendString("Content-Disposition: form-data; name="\(key)"\r\n\r\n")
                body.appendString("\(value)\r\n")
            }
        }
        
        
        // if file is not selected, it will not upload a file to server, because we did not declare a name file
        var filename = ""
        
        if imageSelected == true {
            filename = "post-\(uuid).jpg"
        }
        
        
        let mimetype = "image/jpg"
        
        body.appendString("--\(boundary)\r\n")
        body.appendString("Content-Disposition: form-data; name="\(filePathKey!)"; filename="\(filename)"\r\n")
        body.appendString("Content-Type: \(mimetype)\r\n\r\n")
        body.appendData(imageDataKey)
        body.appendString("\r\n")
        
        body.appendString("--\(boundary)--\r\n")
        
        return body
        
    }
    
    
    // function sending requset to PHP to uplaod a file
    func uploadPost() {
        
        // shortcuts to data to be passed to php file
        let id = user!["id"] as! String
        let uuid = NSUUID().UUIDString
        let text = textTxt.text as String
        
        
        // url path to php file
        let url = NSURL(string: "http://xxxxx/posts.php")!
        let request = NSMutableURLRequest(URL: url)
        request.HTTPMethod = "POST"
        
        // param to be passed to php file
        let param = [
            "id" : id,
            "uuid" : uuid,
            "text" : text
        ]
        
        // body
        let boundary = "Boundary-\(NSUUID().UUIDString)"
        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
        
        // if picture is selected, compress it by half
        var imageData = NSData()
        
        if pictureImg.image != nil {
            imageData = UIImageJPEGRepresentation(pictureImg.image!, 0.5)!
        }
        
        // ... body
        request.HTTPBody = createBodyWithParams(param, filePathKey: "file", imageDataKey: imageData, boundary: boundary)
        
        
        // launch session
        NSURLSession.sharedSession().dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) in
 
            dispatch_async(dispatch_get_main_queue(), {
                
                if error == nil {
                    do {
                        let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary
                        
                        guard let parseJSON = json else{
                            print("Error while parsing")
                            return
                        }
                        
                     print(parseJSON)
 
                    }catch {
                        print("Caught an error: \(error)")
                        
                    }
                }else {
                    print("Error: \(error)")
                }
                
            })
            
            
            
    }.resume()
}
    
 
    // clicked post button
    @IBAction func post_click(sender: AnyObject) {
        
        // if entered some text and text is less than 140 chars
        if !textTxt.text.isEmpty && textTxt.text.characters.count <= 140 {
            
            // call func to uplaod post
            uploadPost()
            
        }
        
    }
    
}

В XCODE ошибку дает вот такую:
Caught an error: Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.



PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 // Insert post in database
    public function insertPost($id, $uuid, $text, $path) {
 
        // sql statement
        $sql = "INSERT INTO posts SET id=?, uuid=?, text=?, path=?";
 
        // prepare sql to be executed
        $statement = $this->conn->prepare($sql);
 
        // error occured
        if (!$statement) {
            throw new Exception($statement->error);
        }
 
        // binding param in place of "?"
        $statement->bind_param("isss", $id, $uuid, $text, $path);
 
        // execute statement and assign result of execution to $returnValue
        $returnValue = $statement->execute();
 
        return $returnValue;
 
    }
Добавлено через 3 часа 24 минуты
Caught an error: Error Domain=NSCocoaErrorDomain Code=3840 "Garbage at end." UserInfo={NSDebugDescription=Garbage at end.}

С пыхой траблы били в синтаксисе, вообщем поймал следуюющую ошибку
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2016, 16:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос PaseJSON - Swift - Выдает ошибку Error Domain=NSCocoaErrorDomain Code=3840 (Swift):

Swift compiler error Command failed due to signal: Bus error: 10 - Swift
Mavericks 10.9.5, VMWare 10.0.3, xCode 6.0.1 (вообще перепробовал все выпуски, в том числе и 6.1 6А1052d от 22 октября 2014).При запуске...

Выдает ошибку sqrt: domain error - C++
Помогите решить проблему! Незнаю почему она выходит, исправте пожалуйста цель задачи: Дано множество точек, построить треугольник таким...

Выдает ошибку sqrt: DOMAIN error - C++ Builder
Выдает ошибку sqrt: DOMAIN error уже при запуске програме когда произвожу рассчет я так понял что в какойто части расчера слишком большое...

На другом компьютере exe файл C++ Builder 6 открывается,но выдает ошибку "pow : DOMAIN error" - C++ Builder
На другом компьютере файл exe открывается но выдает ошибку: pow : DOMAIN error. На моем компе есть Builder, на другом - нет. что делать...

Выдаёт ошибку: acos DOMAIN error,полсе нажатия окей,ещё одну ошибку pow OWERFLAW ERROR - C++ Builder
Здравствуйте! подскажите пожалуйста где ошибка в коде. Выдаёт ошибку: acos DOMAIN error,полсе нажатия окей,ещё одну ошибку pow...

скрип iMacros выдает ошибку MacroSyntaxError: can not parse macro line (Error code: -910) - JavaScript
скрип iMacros выдает ошибку MacroSyntaxError: can not parse macro line (Error code: -910) не могу понять почему

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cin_cout
26 / 26 / 7
Регистрация: 06.10.2012
Сообщений: 119
17.07.2016, 22:46 #2
Зачем обработку коллбэка принудительно в main queue возвращаешь? Обрабатывай весь запрос асинхронно. Нужно будет UI обновить, вернешься в main queue с данными из коллбэка.
kabudasay
3 / 3 / 1
Регистрация: 13.04.2015
Сообщений: 51
19.07.2016, 11:01  [ТС] #3
понял поправил !

Добавлено через 1 минуту
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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
//
 
 
import UIKit
class PostVC: UIViewController, UITextViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    // UI obj
    @IBOutlet var textTxt: UITextView!
    @IBOutlet var countLbl: UILabel!
    @IBOutlet var selectBtn: UIButton!
    @IBOutlet var pictureImg: UIImageView!
    @IBOutlet var postBtn: UIButton!
    
    // unique id of post
    var uuid = String()
    var imageSelected = false
    
    // first func
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // round corners
        textTxt.layer.cornerRadius = textTxt.bounds.width / 50
        postBtn.layer.cornerRadius = postBtn.bounds.width / 200
        selectBtn.layer.cornerRadius = selectBtn.bounds.width / 50
        
        // colors
        selectBtn.backgroundColor = colorDefault
        selectBtn.tintColor = colorWhite
        textTxt.backgroundColor = colorDefault
        postBtn.backgroundColor = colorDefault
        countLbl.textColor = colorGray
 
        // disable auto scroll layout
        self.automaticallyAdjustsScrollViewInsets = false
        
        // disable button from the begining
        postBtn.enabled = false
        postBtn.alpha = 0.4
        
    }
    
    // entered some text in TextView
    func textViewDidChange(textView: UITextView) {
        
        // numb of characters in textView
        let chars = textView.text.characters.count
        
        // white spacing in text
        let spacing = NSCharacterSet.whitespaceAndNewlineCharacterSet()
        
        // calculate string's length and convert to String
        countLbl.text = String(140 - chars)
        
        // if number of chars more than 140
        if chars > 140 {
            countLbl.textColor = colorSmoothRed
            postBtn.enabled = false
            postBtn.alpha = 0.4
            
            // if entered only spaces and new lines
        } else if textView.text.stringByTrimmingCharactersInSet(spacing).isEmpty {
            postBtn.enabled = false
            postBtn.alpha = 0.4
            
            // everything is correct
        } else {
            countLbl.textColor = colorGray
            postBtn.enabled = true
            postBtn.alpha = 1
        }
    }
    
    
    // touched screen
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        // hide keyboard
        self.view.endEditing(false)
    }
    
      // clicked select picture button
    @IBAction func select_click(sender: AnyObject) {
        // calling picker for selecting iamge
        let picker = UIImagePickerController()
        picker.delegate = self
        picker.sourceType = .PhotoLibrary
        picker.allowsEditing = true
        self.presentViewController(picker, animated: true, completion: nil)
    }
    
    // selected image in picker view
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        
        pictureImg.image = info[UIImagePickerControllerEditedImage] as? UIImage
        self.dismissViewControllerAnimated(true, completion: nil)
        
        // cast as a true to save image file in server
        if pictureImg.image == info[UIImagePickerControllerEditedImage] as? UIImage {
            imageSelected = true
        }
    }
    
    // custom body of HTTP request to upload image file
    func createBodyWithParams(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData {
        
        let body = NSMutableData();
        
        if parameters != nil {
            for (key, value) in parameters! {
                body.appendString("--\(boundary)\r\n")
                body.appendString("Content-Disposition: form-data; name="\(key)"\r\n\r\n")
                body.appendString("\(value)\r\n")
            }
        }
        
        // if file is not selected, it will not upload a file to server, because we did not declare a name file
        var filename = ""
        
        if imageSelected == true {
            filename = "post-\(uuid).jpg"
        }
        
        let mimetype = "image/jpg"
        
        body.appendString("--\(boundary)\r\n")
        body.appendString("Content-Disposition: form-data; name="\(filePathKey!)"; filename="\(filename)"\r\n")
        body.appendString("Content-Type: \(mimetype)\r\n\r\n")
        body.appendData(imageDataKey)
        body.appendString("\r\n")
        
        body.appendString("--\(boundary)--\r\n")
        
        return body
    }
    
    // function sending requset to PHP to uplaod a file
    func uploadPost() {
        
        // shortcuts to data to be passed to php file
        let id = user!["id"] as! String
        uuid = NSUUID().UUIDString
        let text = textTxt.text.trunc(140) as String
        
        
        // url path to php file
        let url = NSURL(string: "http://xxx.ru/posts.php")!
        let request = NSMutableURLRequest(URL: url)
        request.HTTPMethod = "POST"
        
        // param to be passed to php file
        let param = [
            "id" : id,
            "uuid" : uuid,
            "text" : text
        ]
        
        // body
        let boundary = "Boundary-\(NSUUID().UUIDString)"
        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
        
        // if picture is selected, compress it by half
        var imageData = NSData()
        
        if pictureImg.image != nil {
            imageData = UIImageJPEGRepresentation(pictureImg.image!, 0.5)!
        }
        
        // ... body
        request.HTTPBody = createBodyWithParams(param, filePathKey: "file", imageDataKey: imageData, boundary: boundary)
        
        // launch session
        NSURLSession.sharedSession().dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) in
            
            // get main queu to communicate back to user
            dispatch_async(dispatch_get_main_queue(), {
            
                if error == nil {
                    
                    do {
                        
                        // json containes $returnArray from php
                        let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary
                        
                        
                        // declare new var to store json inf
                        guard let parseJSON = json else {
                            print("Error while parsing")
                            return
                        }
                        
                        // get message from $returnArray["message"]
                        let message = parseJSON["message"]
                        
                        // if there is some message - post is made
                        if message != nil {
                            
                            // reset UI
                            self.textTxt.text = ""
                            self.countLbl.text = "140"
                            self.pictureImg.image = nil // dont UIImage() ! is nil
                            self.postBtn.enabled = false
                            self.postBtn.alpha = 0.4
                            self.imageSelected = false
                            
                            // switch to another scene 0 = index start from 0
                            self.tabBarController?.selectedIndex = 0
                        }
                        
                    } catch {
                        dispatch_async(dispatch_get_main_queue(), {
                            let message = String(error)
                            appDelegete.infoView(message: message, color : colorSmoothRed)
                        })
                        return
                    }
                    
                } else {
                    //if unable to proceed request
                    dispatch_async(dispatch_get_main_queue(), {
                        let message = error!.localizedDescription
                        appDelegete.infoView(message: message, color : colorSmoothRed)
                    })
                    return
                }
            })
        }.resume()
    }
    
    // clicked post button
    @IBAction func post_click(sender: AnyObject) {
        
        // if entered some text and text is less than 140 chars
        if !textTxt.text.isEmpty && textTxt.text.characters.count <= 140 {
            
            // call func to uplaod post
            uploadPost()
        }
    }
}
 
 
 
 
// Extension to stirng type of variables
extension String {
    
    // cut / trimm our string
    func trunc(length: Int, trailing: String? = "...") -> String {
        
        if self.characters.count > length {
            return self.substringToIndex(self.startIndex.advancedBy(length)) + (trailing ?? "")
        } else {
            return self
        }
        
    }
    
}
cin_cout
26 / 26 / 7
Регистрация: 06.10.2012
Сообщений: 119
19.07.2016, 15:25 #4
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
// launch session
        NSURLSession.sharedSession().dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) in
            
            // get main queu to communicate back to user - не надо, запрос отослан асинхронно (NSURLSession работает асинхронно по умолчанию), будешь получать или неполные данные, или мусор в ответ  
            
                if error == nil {
                    
                    do {
                        
                        // json containes $returnArray from php
                        let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary
                        
                        
                        // declare new var to store json inf
                        guard let parseJSON = json else {
                            print("Error while parsing")
                            return
                        }
                        
                        // get message from $returnArray["message"]
                      [B] if let message = parseJSON["message"][/B]
                        
                        // if there is some message - post is made
                        [S]if message != nil [/S][B]{[/B]
 //когда обращаемся к UI, используем GCD
dispatch_async(dispatch_get_main_queue()) { 
                            // reset UI
                            self.textTxt.text = ""
                            self.countLbl.text = "140"
                            self.pictureImg.image = nil // dont UIImage() ! is nil
                            self.postBtn.enabled = false
                            self.postBtn.alpha = 0.4
                            self.imageSelected = false
                            
                            // switch to another scene 0 = index start from 0
                            self.tabBarController?.selectedIndex = 0
                        }
                        
                    } catch {
                        //это не надо dispatch_async(dispatch_get_main_queue(), {
                            let message = String(error)
                            appDelegete.infoView(message: message, color : colorSmoothRed)
                        })
                        return
                    }
                    
                } else {
                    //if unable to proceed request
                    //это не надо dispatch_async(dispatch_get_main_queue(), {
                        let message = error!.localizedDescription
                        appDelegete.infoView(message: message, color : colorSmoothRed)
                    })
                    return
                }
            })
        }.resume()
    }
не совсем понял, что за вызов appDelegate.infoView - ? там какой-то AlertController отображается? тогда просто одну эту строку надо обернуть в dispatch_async(dispatch_get_main_queue()) { appDelegete.infoView(message: message, color : colorSmoothRed) }
со скобками в XCode проще разобраться, чем тут
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2016, 15:25
Привет! Вот еще темы с ответами:

НАПИСАЛ ПРОГРАММУ! выдает DOMAIN ERROR !хотя считает! - C++
Я в С++ вообще только седня начал разбираться) с Дельфей как то не сложно все! а тут тупняк!( вот написал программу для такого задания: ...

Ошибки Pow: Domain error и Log10: Domain error - C++ Builder
Здравствуйте, возникла проблема, при компиляции программы выдаёт ошибки, указанные в заголовке, первую выдаёт при выполнение функции: ...

Программа выдает ошибку: exit code 2 - Free Pascal
Дошел до этого момента, решил попробовать, как идет программа, а она выдает ошибку exit code 2 из-за чего может это быть? program ZZZ; ...

При компиляции выдает ошибку [Fatal Error] Unit4.pas(10): Internal error: SY576 - Delphi
При компиляции выдает ошибку Unit4.pas(10): Internal error: SY576 и выделяет строку TForm4=class(TForm) ... Делфи...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.07.2016, 15:25
Ответ Создать тему
Опции темы

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