Вопрос был:
Как вернуть ответ от асинхронного вызова?
, который может быть интерпретирован как:
Как сделать синхронный асинхронный код синхронным?
Решение будет состоять в том, чтобы избежать обратных вызовов и использовать комбинацию Promises и async / await.
Я хотел бы привести пример для запроса Ajax.
(Хотя он может быть записан в Javascript, я предпочитаю писать его на Python и компилировать его в Javascript, используя Transcrypt . Это будет достаточно ясно.)
Позволяет сначала включить использование JQuery, чтобы
$
был доступен какS
:__pragma__ ('alias', 'S', '$')
Определить функцию, которая возвращает Promise, в этом случае вызов Ajax:
def read(url: str): deferred = S.Deferred() S.ajax({'type': "POST", 'url': url, 'data': { }, 'success': lambda d: deferred.resolve(d), 'error': lambda e: deferred.reject(e) }) return deferred.promise()
Использовать асинхронный код, как если бы он был синхронным:
async def readALot(): try: result1 = await read("url_1") result2 = await read("url_2") except Exception: console.warn("Reading a lot failed")
Когда ваш основной ViewController имеет тип UITableViewController , он имеет свойство clearsSelectionOnViewWillAppear
, которое по умолчанию YES
- так что он автоматически очистит выделение.
Это свойство недоступно для UITableView , я думаю, это потому, что он не имеет метода ViewWillAppear
.
A UIViewController не нуждается в этом свойстве, потому что изначально он не имеет UITableView
.
вывод: вам придется реализовать его самостоятельно, когда вы не используете UITableViewController
.
Я не думаю, что снятие выделения выбранной строки происходит автоматически ... Я обычно делаю это, прежде чем перейти к следующему представлению
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
// to do other things
[self.navigationController pushViewController:yourNextViewController animated:YES];
}
Нет ничего плохого - снятие выделения выделенной строки всегда «вручную». Если вы посмотрите пример кода Apple, вы увидите то же самое.
В swift вы можете добавить следующие строки в свой viewWillAppear
if let row = tableView.indexPathForSelectedRow() {
tableView.deselectRowAtIndexPath(row, animated: false)
}
. В swift 2 это без скобок:
if let row = tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(row, animated: false)
}
В Swift 4 (и 3?) Имя функции было очищено:
if let indexPath = tableView.indexPathForSelectedRow {
tableView.deselectRow(at: indexPath, animated: false)
}
Отмените выбор в didSelectRowAtIndexPath
вместо viewWillAppear
:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//show the second view..
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}