1

Я только начал разрабатывать приложения для платформы iOS, и я использую веб-службы Azure для доступа к удаленной базе данных. Я вызывал метод readWithCompletion: в таблице, чтобы попробовать и прочитать все данные в моей базе данных с сервера.Почему я не могу установить значение свойства как аргумент items для блока завершения readWithCompletion?

В блоке завершения вызова метода я зарегистрировал аргумент items на консоли и мои данные успешно сходят. Я пробовал это NSMutableArray *stops = [items mutableCopy], чтобы получить данные за пределами блока завершения, но stops равен нулю, если он выходит за рамки блока завершения.

Что я здесь делаю неправильно?

[self.table readWithCompletion:^(NSArray *items, NSInteger totalCount, NSError *error) { 
    self.stops = [items mutableCopy]; 
}]; 
+2

Звуки, как если бы readWithCompletion асинхронный метод, следовательно, ваш блок будет называться после того, как встроенный метод уже вышел из сферы действия. Независимо от того, что вам нужно после выполнения этого блока, можно было бы красиво завернуть в новый метод, который вызывается прямо из этого блока. – Till

+0

Вы используете ARC? Является ли свойство 'stops' объявленным как' strong' или 'keep'? – Tricertops

ответ

2

Если блок работает асинхронно, что и следовало ожидать для веб-запрос, то переменные, измененные в блоке не будет изменен, пока блок выполняется, который будет происходить позже, после того, как запрос завершается.

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

@property (weak, nonatomic) IBOutlet *tableview; 
@property (strong, nonatomic) NSArray *model; 

[webRequest performRequest:^(NSArray *result) { 
    // this code runs later, when the request completes 
    self.model = result; 
    // update our UI to indicate that we fetched some data 
    [self.tableview reloadData]; 
}]; 

// this code runs right away, so self.model is uninitialized at this point 
// this is where we should update our UI to say that we are busy fetching data 
+0

хорошо, технически это не будет компилироваться, поскольку вы не можете назначить захваченную переменную ''block'' внутри блока – newacct

+0

« абстрактный код ». он не предназначен для компиляции. это призвано проиллюстрировать точку зрения на асинхронный. но, я все равно исправлю .... – danh

+0

@danh Я уже возился с моим кодом, и блок работает асинхронно, как вы предложили, так как это блок завершения, который запускается после завершения веб-запроса. Как я могу обновить UITableView с данными, которые я возвращаю после того, как они были получены? –

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