2015-08-17 6 views
0

Я делаю HTTP-запрос с NSURLSession, который требует закрытия, которое будет выполняться в конце запроса. Внутри замыкания я пытаюсь вызвать функцию и передать объект returnList этой функции.Вызов функции и прохождение параметров из замыкания в Swift

Проблемы: Когда я распечатать список с функцией callback(), она пуста, даже если я присвоить значение объекта списка внутри крышки. В чем причина этого поведения и что мне нужно сделать, чтобы передать объект функции, которая вызывается внутри замыкания?

var returnList = [ReturnList]() 
    ... 
    ... 
    func httpRequestFunction(callback: ([ReturnList])->()){ 
    let task = NSURLSession.sharedSession().dataTaskWithURL(url){(data, response, error) in 

       if error != nil { 
        //TODO do some error handling 
        return 
       } 


       var xmlUtil = XMLUtil(data: data) 
       self.returnList = xmlUtil.parseXML() 
       println(self.returnList.count) // returns 1 
       callback(self.returnList) /*the callback prints returnList.count which is then 0 */ 


      } 

      task.resume() 
    } 
+0

У вас недостаточно кода для вашего вопроса, чтобы иметь смысл. Что такое ReturnList? Откуда появился обратный вызов и как он выглядит? И так далее. – matt

+0

ReturnList - это просто определенный тип. Список может быть любого типа. callback() - это просто некоторая самоопределяемая функция, которая принимает в качестве параметра список объектов ReturnList. – TheBaj

+0

Итак, я понял, что вы не хотите отвечать на мои вопросы. Но поскольку то, что вы описываете, не является ожидаемым поведением, что делает невозможным вам помочь. Информация, необходимая для того, чтобы догадаться, почему это происходит, если это происходит, отсутствует в вопросе, поскольку вы его поставили. – matt

ответ

1

Что вы описываете, это не нормально, поэтому что-то еще должно происходить. Например:

typealias ReturnList = Int 
var returnList = [ReturnList]() 
func httpRequestFunction(callback: ([ReturnList])->()) { 
    self.returnList = [1,2,3] 
    print(self.returnList.count) // prints 3 
    callback(self.returnList) // prints 3 
} 
func test() { 
    httpRequestFunction { 
     list in 
     print(list.count) 
    } 
} 

Он отлично работает. Поскольку это не тот результат, который вы получаете, вы должны делать что-то еще не так - но нет никакого способа узнать, что это такое, поскольку вы отказываетесь показывать какой-либо код.

Например, вы сказать что callback печатает returnList.count, но, конечно, лучше не печатать self.returnList.count - это нужно напечатать счет списка , что он получил в качестве параметра (как в моем примере выше) , Но вы отказываетесь показывать это, так как я знаю, что вы все правильно делаете? И так далее.

Другим источником трудностей является то, что вы получаете доступ к переменной экземпляра, self.returnList, из-за обратного вызова HTTP. Итак, кто знает, в какой теме мы живем? Если это происходит в фоновом потоке, может возникнуть какая-то другая нить и изменить self.returnList между моментом print и временем, которое мы вызываем callback в самой следующей строке! Таким образом, потребуется дополнительная информация.

+0

Вы были правы, мой обратный вызов напечатал совершенно другой список. – TheBaj

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