2015-08-13 4 views
0

Я использую AWS для размещения изображений для моего приложения iOS. Сейчас я пытаюсь перечислить все объекты в ведре S3.Swift - Variable не сохраняет значение

Вот мой код:

var description = "" 
AWSS3.registerS3WithConfiguration(serviceConfig2, forKey: "s3") 
AWSS3.S3ForKey("s3").listObjects(objectList).continueWithBlock { (task: AWSTask!) -> AnyObject! in 
    if task.error != nil { 
     println(task.error) 
    } 
    if task.result != nil { 
     description = task.result!.description 
     println(description) 
    } 
    return nil 
} 

println(description == "") 

Выход true с последующим правильным содержанием task.result!.description. Другими словами, println за пределами continueWithBlock сначала печатает, а description не был обновлен в это время.

Как я могу что-то делать с description за пределами continueWithBlock?

ответ

1

Вы можете присвоить значение, что вам нужно в другую переменную внутри рамки вашего класса или функции, то вы можете вызвать didSet по переменной и выполнять другую функцию, если вам нужно, например:

var someVariableInScopeOfWhereItsNeeded = "abc" { 

    didSet { 

     self.maybeSomeOtherFunctionNow 

    } 
} 
+0

Это не работает. Когда задана переменная 'description', метод didSet не вызывается, но если я поместил' println (description) 'после инициализации переменной, тогда он корректно выполнит' println' – Infamous911

+0

. Это зависит от того, где у вас есть переменная определяется, например, если у вас есть переменная, определенная вне области действия функции, которая запускает задачу asynch, тогда она будет вызвана. Если вы определяете его внутри функции, которая заканчивается до того, как будет установлена ​​переменная, она никогда не будет вызвана. Короткий ответ, укажите описание переменной экземпляра. Кроме того, см. Ответ @Duncan C и ссылку –

+0

Хорошо, да, я получил его, чтобы работать сейчас, спасибо. Вопрос в том, что у меня есть куча кода после этого continueWithBlock, мне просто нужно все это поместить в методе didSet переменной? (Материал после того, как он продолжаетWithBlock частично зависит от результатов continueWithBlock) – Infamous911

2

Вы спросили:

Как я должен делать вещи с описанием вне continueWithBlock

Короткий ответ: Нет.

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

Why does Microsoft Azure (or Swift in general) fail to update a variable to return after a table query?

(Не обманывайте себя тем, что он упоминает MS Azure Это на самом деле не имеет ничего общего с Azure.).

Решение @thefredelement использования метода didSet для переменной, которая получает задание, также будет работать.

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