保留循环内的值

时间:2016-04-18 14:15:11

标签: swift

我有这个for循环,它通过我的URL记录进行迭代并发出请求。请求的结果再次用于上传其他待处理的内容。但是我在这一行中收到错误:print("id is \(t.url!)")。我想循环已经在执行该行代码时完成,这就是它返回nil的原因。 你有什么建议吗?

let fetchRequest = NSFetchRequest(entityName:"Pending")

                        let company_temp = try context.executeFetchRequest(fetchRequest)
                        let company = company_temp as! [Pending]
                        for t in company {
                            let request = NSURLRequest(URL: NSURL(string:t.url!)!)

                            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
                                print("ticket is \(NSString(data: data!, encoding: NSUTF8StringEncoding))")
                                print("id is \(t.url!)")
                                print("id is \(t.id!)")
                                self.upload_sig(NSString(data: data!, encoding: NSUTF8StringEncoding)!, id: t.id!)



                        }

2 个答案:

答案 0 :(得分:1)

很难说为什么它不起作用,但我猜想托管对象要么不再存在,要么它所处的上下文已被破坏,所以它无法填充它的数据而你得到一个错误。

在您的特定情况下,如果URL请求,您实际上并不需要处理完成的代码中的对象,因此不要将其保留在那里。相反,只捕获您需要的ID而不是容器:

let request = NSURLRequest(URL: NSURL(string:t.url!)!)
let objectId = i.id!

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
    print("ticket is \(NSString(data: data!, encoding: NSUTF8StringEncoding))")
    print("id is \(objectId)")
    self.upload_sig(NSString(data: data!, encoding: NSUTF8StringEncoding)!, id: objectId)

另请注意,您应该使用!谨慎地检查error s ...

答案 1 :(得分:0)

如果您想在更近的位置访问其他临时值,可以执行以下操作:

func makeFechRequest(url: String, id: String) -> ((NSURLResponse, NSData, NSError) -> ()) {
    let url = url
    let id = id

    func request(response: NSURLResponse, data: NSData?, error: NSError) {
        print("ticket is \(NSString(data: data!, encoding: NSUTF8StringEncoding))")
        print("id is \(url)")
        print("id is \(id)")
        self.upload_sig(NSString(data: data!, encoding: NSUTF8StringEncoding)!, id: id)
    }
    return request
}

然后这样称呼:

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), 
                                             makeFetchRequest(url: t.url!, id: t.id!))

我不确定我的所有类型都是正确的,但这应该可以帮到你的大部分时间

文档here