【问题标题】:Swift passing same array value to PHP/MySQLSwift 将相同的数组值传递给 PHP/MySQL
【发布时间】:2018-08-29 23:34:47
【问题描述】:

我有一个应用程序,用户可以在其中评论一组用户。例子: ["user1","user2","user3","user4"] 当用户评论第一个用户时,应用程序应该呈现第二个用户进行投票。不幸的是,当用户对 user2、user3、user4 进行投票时; user1 的值是放在数据库中的值。我通过邮递员测试了 PHP,那里没有问题,所以它必须在 swift 代码中。这是我的代码:

func loadCards()->[String] {
    let username = user!["username"] as! String
    let url = URL(string: "http://localhost/shotsCenter.php")!
    var request = URLRequest(url: url) 
    request.httpMethod = "POST" 
    let body = "username=\(username)"
    request.httpBody = body.data(using: .utf8)
    // launch session
    URLSession.shared.dataTask(with: request) { data, response, error in            
        // getting main queue of proceeding inf to communicate back, in another way it will do it in background
        // and user will no see changes :)
        DispatchQueue.main.async(execute: {

            if error == nil {

                do {

                    let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String: AnyObject]

                    // clean up
                    self.valueArray.removeAll(keepingCapacity: false)
                    self.circleArray.removeAll(keepingCapacity: false)

                    // delcare new secure var to store json
                    guard let parseJSON = json else {
                        print("Error while parsing")
                        return
                    }

                    // declare new secure var to store $returnArray["users"]
                    guard let parseUSERS = parseJSON["users"] else {
                        print(parseJSON["message"])
                        return
                    }

                    self.valueArray = parseUSERS as! [AnyObject]

                    if self.valueArray.count > 0 {

                        let num_currentLoadedCardsArrayCap = (self.valueArray.count > MAX_BUFFER_SIZE) ? MAX_BUFFER_SIZE : self.valueArray.count
                        for (i, value) in self.valueArray.enumerated() {
                            let ava = self.valueArray[i]["ava"]
                            let id = self.valueArray[i]["id"]

                            let age = (NSString(format: "%@", self.valueArray[i]["age"] as! CVarArg))
                            let city = self.valueArray[i]["city"]
                            let state = self.valueArray[i]["state"]
                            self.age.append(age as AnyObject)
                            self.city.append(city as AnyObject)
                            self.state.append(state as AnyObject)

                            let url = NSURL(string: ava! as! String)! 
                            let imageData = try? Data(contentsOf: url as URL)
                            let image = UIImage(data: imageData!)!
                            self.circleArray.append(image)
                            let reviewed = self.valueArray[i]["username"]
                            self.reviewed.append((reviewed as AnyObject) as! String)
                            print("reviewed user", reviewed! as Any)

                            let newCard = self.createDraggableViewWithData(at: i, value:value as! NSDictionary)

                            self.allCardsArray.append(newCard)
                            if i < num_currentLoadedCardsArrayCap {
                                self.currentLoadedCardsArray.append(newCard)
                            }
                        }

                        for (i,_) in self.currentLoadedCardsArray.enumerated() {
                            if i > 0 {
                                self.viewTinderBackGround.insertSubview(self.currentLoadedCardsArray[i], belowSubview: self.currentLoadedCardsArray[i - 1])
                            }
                            else {
                                self.viewTinderBackGround.addSubview(self.currentLoadedCardsArray[i])
                            }
                            self.currentIndex += 1
                        }
                        self.animateCardAfterSwiping()
                        self.perform(#selector(self.createDummyCard), with: nil, afterDelay: 1.0)
                    }


                } catch {
                    // get main queue to communicate back to user
                    DispatchQueue.main.async(execute: {
                        let message = "\(error)"

                    })
                    return
                }


            } else {
                DispatchQueue.main.async(execute: {
                    let message = error!.localizedDescription
                })
                return
            }

        })
        } .resume()
    return reviewed
}

func insertShot(_ rating: String, _ reviewed2: NSDictionary) {

   let reviewer = user!["username"] as! String
    let reviewed2 = reviewed[index]

    let url = URL(string: "http://localhost/shotsCenter.php")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"

    // param to be passed to php file
    let param = [
        "user" : reviewer,
        "revieweduser" : reviewed2,
        "rating" : rating
        ] as [String : Any]
    // body
    let boundary = "Boundary-\(UUID().uuidString)"
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    // ... body
    request.httpBody = createBodyWithParams(param as? [String : String], boundary: boundary)


    // launch session
    URLSession.shared.dataTask(with: request) { data, response, error in

        // get main queu to communicate back to user
        DispatchQueue.main.async(execute: {


            if error == nil {

                do {

                    // json containes $returnArray from php
                    let json = try JSONSerialization.jsonObject(with: 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"]
                    //print(message)

                    // if there is some message - post is made
                    if message != nil {

                        // reset UI
                        // self.msgTxt.text = ""

                        // switch to another scene
                        //self.tabBarController?.selectedIndex = 3
                        //_ = self.navigationController?.popViewController(animated: true)


                    }

                } catch {

                    // get main queue to communicate back to user
                    DispatchQueue.main.async(execute: {
                        let message = "\(error)"
                        appDelegate.infoView(message: message, color: colorSmoothRed)
                    })
                    return

                }

            } else {

                // get main queue to communicate back to user
                DispatchQueue.main.async(execute: {
                    let message = error!.localizedDescription
                    appDelegate.infoView(message: message, color: colorSmoothRed)
                })
                return

            }


        })

        }.resume()

}

【问题讨论】:

    标签: arrays swift


    【解决方案1】:

    不知道currentIndex 是干什么用的。关于视图层次结构?

    index 是一个有趣的候选人。它的唯一使用时间是在

    let reviewed2 = reviewed[index]
    

    我没有看到任何修改。由于用户名存储在那里

    let reviewed = self.valueArray[i]["username"]
    

    我认为您为所有四个ratings 发送相同的用户名,因为reviewed2 是由.httpBody 组成的。这是我所看到的猜测。

    提示:可编码

    Codable 可以为您节省很多与AnyObject & co 杂耍的麻烦,因为您将拥有一个[User] 数组而不是.. 4 个单独的数组,您可以使用 [index] 访问它们。 https://app.quicktype.io 将为您提供给定 JSON 的解析代码,帮助您快速入门。

    【讨论】:

    • 非常感谢您的洞察力。我正在使用脚本 TinderSwipeView 而 currentIndex 是我一直在努力解决的值之一。当我用 currentIndex 替换索引时,我得到一个“索引超出范围”。
    • index 是做什么的,它的用途是什么,在哪里改变了,为什么,为了什么? currentIndex 也一样。这很重要,因为您使用它来访问var reviewed: [String],即用户名数组。
    • @techgirl 我问这个是因为你只是说“另一个索引给了我超出范围”,而没有解释为什么你会使用另一个而不是当前变量。如果它们只是索引,用另一个替换,那么它们根本不能用于任何任务,因为由于可互换使用,这些值是未知的。我的意思是我没有从显示的代码中看到它们的目的。
    • 我删除了 index 和 currentIndex 并尝试了刚刚审查过的 2 = 审查过。当我打印结果时,它显示为 ["user1", "user2", "user3"] 并且不会在数据库中插入任何内容。
    • 如果我是刻薄的,我会说:只需将let MAX_BUFFER_SIZE = 3; 设置为 100 或其他任何值,不知道这对您有何改变,但它应该可以解决您的“3”问题。但是.. 无论如何,在每次刷卡时执行的func removeObjectAndAddNewValues() 内部,currentlyLoadedCards 中的第一张卡被删除,allCardsArray 中添加了一张新卡,所以currentlyLoadedCards 应该不会很快用完卡,只要allCardsArray 被“填充”,请参阅func removeObjectAndAddNewValues() 中的 if 条件。开发人员可能不想在内存中保存 1000 个视图,但 3 个没问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2019-03-06
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多