2016-04-18 4 views
0

У меня есть это для цикла, который повторяется через мои записи URL-адресов и делает запрос. Результат запроса снова используется для загрузки других незавершенных материалов. Но я получаю ошибку в этой строке: print("id is \(t.url!)"). Я думаю, что цикл уже выполняется, когда эта строка кода выполняется, поэтому она возвращает нуль. У вас есть рекомендации по этому поводу?Сохранять значения внутри цикла

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

как насчет t.id? успешно ли он выполняется? –

+0

Вы получаете неожиданно нулевое исключение? управляемый объект все еще существует в репозитории? существует ли его контекст? – Wain

+0

№ Когда я удаляю часть t.url. Ошибка nil указывает на t.id –

ответ

1

Трудно сказать, почему он не работает, но я предполагаю, что управляемый объект либо не существует более или что контекст его в был разрушен, поэтому он не может заполнить это данные, и вы получаете сообщение об ошибке.

В вашей конкретной ситуации вам действительно не нужен объект в коде, касающемся завершения, если запрос URL-адреса, поэтому не сохраняйте его там. Вместо этого возьмите только требуемый идентификатор, а не контейнер:

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 с ...

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

Смежные вопросы