Вы можете передать обратный вызов и вызвать обратный вызов внутри асинхронного вызова
примерно так:
class func getGenres(completionHandler: (genres: NSArray) -> ()) {
...
let task = session.dataTaskWithURL(url) {
data, response, error in
...
resultsArray = results
completionHandler(genres: resultsArray)
}
...
task.resume()
}
, а затем вызвать этот метод:
override func viewDidLoad() {
Bookshop.getGenres {
genres in
println("View Controller: \(genres)")
}
}
Как сказал Симеон, мое мнение такое же, я хотел бы добавить немного больше информации с ним.
Когда вы получили даты, вам нужно сделать две вещи:
Вы не добавили примерные даты JSON, о которых идет речь, я я предполагаю, что у вас есть JSON, как показано ниже.
[
{name: "Something", date: "12-12-2018"},
{name: "Something", date: "12-12-2017"},
{name: "Something", date: "12-12-2019"},
{name: "Something", date: "12-5-2018"},
{name: "Something", date: "12-2-2018"},
{name: "Something", date: "SOMETHING_INVALID"},
{name: "Something", date: "12-12-2016"},
]
Вы можете отфильтровать действительную дату и будущие даты с таким фильтром,
let dates = [
{name: "Something", date: "1-12-2018"},
{name: "Something", date: "2-12-2017"},
{name: "Something", date: "3-12-2019"},
{name: "Something", date: "4-5-2018"},
{name: "Something", date: "5-2-2018"},
{name: "Something", date: "InvalidSomething"},
{name: "Something", date: "7-12-2016"},
]
let filteredDates = dates.filter((item) => {
let date = new Date(item.date);
if(date !== 'Invalid Date' && Date.now() < date.getTime()){
return item;
}
});
console.log(filteredDates);
Небольшое пояснение: Date.now()
и date.getTime()
оба используются для получения timestamp , и я сравниваю внутри JavaScript Filter, если объект даты не возвращает строку "Invalid Date"
, и если номер временной метки ** больше, чем сегодняшняя метка времени, тогда это будущая дата.
Когда эти два условия совпадают, тогда filter
он вернет целую object
, которая собирается с помощью переменной filteredDates
. когда цикл будет выполнен, вы получите массив для дальнейшего использования. Ура!
Я не знаю, как выглядят ваши данные, но, вообще говоря, вам нужно выполнить два шага:
new Date(<ISO 8601 string>)
:
new Date("2018-06-12"); // -> Tue Jun 12 2018 01:00:00 GMT+0100
new Date("2018-07-13"); // -> Fri Jul 13 2018 01:00:00 GMT+0100
Фильтрация прошлых событий может быть выполнена с помощью Array.filter
. Вы даете ему функцию, которая возвращает True
или False
, и запускает ее для каждого элемента массива. Элементы, для которых возвращенный functiuon True
помещается в новый массив:
[1, 3, 4, 6, 7].filter(number => number > 4); // -> [6, 7]
[1, 3, 4, 6, 7].filter(number => number <= 4); // -> [1, 3, 4]
Итак, чтобы фильтровать прошлые даты / время, вы просто сравниваете их с сегодняшней датой. Единственная сложность в том, что предоставление строки, такой как 2018-06-07
(только дата, без указания времени) на new Date(…)
, устанавливает время на текущее:
new Date("2018-06-07"); // -> Thu Jun 07 2018 01:00:00 GMT+0100
Если вам нужно сравнить только по дней, а не часов или даже минут, удобно установить время до полуночи:
(new Date("2018-06-07")).setHours(0) // -> Thu Jun 07 2018 00:00:00 GMT+0100
Итак, когда собрано:
const data = {
events: [
{ name: "Event 1", date: "2018-06-12" },
{ name: "Event 2", date: "2018-07-10" },
{ name: "Event 3", date: "2018-07-12" },
{ name: "Event 4", date: "2018-07-13" },
{ name: "Event 5", date: "2018-08-01" }
]
}
const today = (new Date()).setHours(0) // past midnight
const todayAndFutureEvents = data.events.filter(event => (new Date(event.date)) >= today);
console.log(todayAndFutureEvents);
Еще одна проблема может возникнуть, если ваши события происходят в нескольких часовых поясах, но это, вероятно, выходит за рамки этого вопроса ...
Ну, вы действительно не располагаете достаточной информацией о своей структуре JSON и тем, что вы уже достигли, поэтому, пожалуйста, добавьте больше деталей, если этого недостаточно, но что-то вроде этого, я предполагаю:
var eventsFromMyJSONstring = JSON.parse(theJSONstringFetchedFromCertainURL);
var currentDate = new Date();
eventsFromMyJSONstring.forEach(function(iEvent) {
iEvent.newVarAsDate = new Date(iEvent.textDate);
if (iEvent.newVarAsDate >= currentDate) {
alert('hey, this object is from today or future');
}
});
edit: также, возможно, вы хотите использовать фильтр, чтобы получить только текущие и будущие события ... что-то вроде:
var currentAndFutureEvents = eventsFromMyJSONstring.filter((iEvent) => new Date(iEvent.textDate) >= new Date());
(ES6 предположил там ...)
Если вы передадите эту строку новой функции Date (yourString), она вернет вам объект даты JavaScript.
https://developer.mozilla.org/en-US/ docs / Web / JavaScript / Reference / Global_Objects / Date
Пример:
const newDate = new Date('2008-09-15T15:53:00')
// Will return a date object with the value of:
// Mon Sep 15 2008 15:53:00 GMT-0700 (Pacific Daylight Time)
const currentDate = Date.now();
// Will return a date object with the current date.
console.log(newDate < currentDate);
// Will compare the two dates.
var eventTime = new Date (event.time)
ЕСЛИ мой JSON выглядит так ''event'{ time: ''date in a string'' }'
– DavidB
13 July 2018 в 13:47