我有这个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!)
}
答案 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