[решено] Функция возвращает пустой массив. Почему


#21

Исправьте так:

enum Error: Swift.Error { case emptyData }

Можете свою ошибку объявить, это я так для примера написал.


#22

теперь приложение крашится на вот этой строке:

group.leave()

Thread 9: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)


#23

Дело явно не в group.leave, если упростить:

func fetchData(completion: @escaping ([String]) -> Void) {
    var array = [String]()
    let group = DispatchGroup()
    for _ in 0..<3 {
        group.enter()
        let url = URL(string: "https://forum.swiftbook.ru/t/funkcziya-vozvrashhaet-pustoj-massiv-pochemu")!
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            enum Error: Swift.Error { case emptyData }
            do {
                guard let data = data else { throw error ?? Error.emptyData }
                array.append(String(data: data, encoding: .utf8)!)
            } catch let error {
                print("error", error)
            }
            group.leave()
        }.resume()
    }
    group.notify(queue: .main) {
        completion(array)
    }
}


fetchData { strings in
    print(strings)
}

Будет работать как надо.


#24

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


#25

В консоли что пишет?


#26

В консоли ничего не пишет. Только мои принты и пустой массив за пределами функции.


#27

Тогда может ошибку покажете?


#28

да ошибка не меняется, все та же

Thread 11: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)


#29

Лучше всеь текст из консли покажите, чтобы легче понимать проблему


#30

давайте все сразу положу сюда

вот функция:

func fetchData(completion: @escaping ([String]) -> Void) {
    loadingActivityIndicator.startAnimating()
    bookmarksTable.isHidden = true
    var arrayOfBookmarks = [String]()
    for i in 0..<arrayID.count {
        DispatchGroup().enter()
            let jsonURL = "https://mfc.group/mobile-api/get-news.php?linkCode=\(arrayLink[i])&elementId=\(arrayID[i])"
            guard let url = URL(string: jsonURL) else { return }
            URLSession.shared.dataTask(with: url) { (data, response, error) in
                
                enum Error: Swift.Error { case emptyData }
                do {
                    guard let data = data else { throw error ?? Error.emptyData }
                    //let bookmarksMod = try JSONDecoder().decode(BookmarksModel.self, from: data)
                    arrayOfBookmarks.append(String(data: data, encoding: .utf8)!)
                    print(arrayOfBookmarks, "print 1")
                    DispatchGroup().leave()
                } catch let error {
                    print("json serialization error", error)
                }
                print(arrayOfBookmarks, "inside 2", arrayOfBookmarks.count)
                }.resume()

        print(arrayOfBookmarks, "inside 3", arrayOfBookmarks.count)
    }
    DispatchGroup().notify(queue: .main) {
        completion(arrayOfBookmarks)
    }
    print(arrayOfBookmarks, "print 4")
}

вот так я ее вызываю:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    fetchData() { strings in
        print(strings, "LOOOOOOOOOOP")
    }
}

а вот это в консоли после вызова и ошибки:

2019-06-08 18:29:23.409121+0300 MFC[92558:2996509] - <AppMeasurement>[I-ACS036002] Analytics screen reporting is enabled. Call +[FIRAnalytics setScreenName:setScreenClass:] to set the screen name or override the default screen class name. To disable screen reporting, set the flag FirebaseScreenReportingEnabled to NO (boolean) in the Info.plist

2019-06-08 18:29:24.529812+0300 MFC[92558:2996509] 5.20.0 - [Firebase/Core][I-COR000008] The project’s Bundle ID is inconsistent with either the Bundle ID in ‘GoogleService-Info.plist’, or the Bundle ID in the options if you are using a customized options. To ensure that everything can be configured correctly, you may need to make the Bundle IDs consistent. To continue with this plist file, you may change your app’s bundle identifier to ‘com…MFC’. Or you can download a new configuration file that matches your bundle identifier from https://console.firebase.google.com/ and replace the current one.

2019-06-08 18:29:24.621271+0300 MFC[92558:2996520] 5.20.0 - [Firebase/Analytics][I-ACS023007] Analytics v.50801000 started

2019-06-08 18:29:24.621550+0300 MFC[92558:2996520] 5.20.0 - [Firebase/Analytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see http://goo.gl/RfcP7r)

2019-06-08 18:29:24.786452+0300 MFC[92558:2996400] [Warning] Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell’s content view. We’re considering the collapse unintentional and using standard height instead.

2019-06-08 18:29:24.944988+0300 MFC[92558:2996535] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C1.1:2][0x7fe2c7d12e50] get output frames failed, state 8196

2019-06-08 18:29:24.945305+0300 MFC[92558:2996535] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C1.1:2][0x7fe2c7d12e50] get output frames failed, state 8196

2019-06-08 18:29:24.946326+0300 MFC[92558:2996535] TIC Read Status [1:0x0]: 1:57

2019-06-08 18:29:24.946526+0300 MFC[92558:2996535] TIC Read Status [1:0x0]: 1:57

Permission granted: true

Notification settings: <UNNotificationSettings: 0x600000250bd0; authorizationStatus: Authorized, notificationCenterSetting: Enabled, soundSetting: Enabled, badgeSetting: Enabled, lockScreenSetting: Enabled, carPlaySetting: NotSupported, criticalAlertSetting: NotSupported, alertSetting: Enabled, alertStyle: Banner, providesAppNotificationSettings: No>

Failed to register: Error Domain=NSCocoaErrorDomain Code=3010 “remote notifications are not supported in the simulator” UserInfo={NSLocalizedDescription=remote notifications are not supported in the simulator}

[“2730”]

[“news-trand”]

[“2730”, “2731”]

[“news-trand”, “news-trand”]

[] inside 3 0

[] inside 3 0

[] print 4

[] LOOOOOOOOOOP

["{“id”:“2730”,“theme”:“В центре внимания”,“title”:“Рост, который должен был состояться, состоялся”,“content”:“То, что вчера состоялось на Уолл-Стрит, вполне ожидаемо по одной той причине, что, коснувшись уровня в диапазоне между 2 727,27 и 2 765,43 пунктов по индексу широкого рынка Standard & Poor’s 500, рынок достиг расположения дневной средней скользящей по Индексу широкого рынка Standard & Poor’s 500, и, естественно, от неё отразился. Причём к этому оказались приурочены и слова со стороны членов ФРС США о том, что при необходимости со стороны американского регулятора будет долларовый дождь, и это было лейтмотивом выступления председателя ФРС США Джерома Пауэлла, который донёс эту мысль до глобальных инвесторов, выступая в ФРБ Далласа во вторник. \r\n\r\nРынки ухватились за эту идею и выросли очень убедительно. Правда рынки совсем забыли о состоянии мировой экономики и прочих вызовах текущего времени. Им очень понравилось, что глава ФРС США Джером Пауэлл заявил в своём выступлении в Далласе о том, что американский финансовый регулятор пристально следит за наступившей так называемой «горячей фазой» внешнеторговой войны между США и КНР. Кроме того, глава главного финансового ведомства ведущей мировой экономики отметил в своём выступлении, что он лично готов отреагировать в целях поддержания стабильного роста экономики Америки. Читаем между строк: «Если что произойдёт негативного – мы, ФРС США, понизим вам ставку рефинансирования». Сейчас рынок ожидает, что снижение ставки в текущем календарном году будет проведено дважды, а если сам Пауэлл говорит о готовности её, ставку, снижать, то так и до трёх понижений можно будет дожить. Вчера я уже писал об этом, если кто не помнит, то повторюсь.\r\n\r\nНе даром аналитики из инвестиционно-банковского конгломерата JPMorgan Chase & Co. уже понизили прогнозы по доходности американских государственных облигаций (американских трежерис). Они акцентируют внимание глобальных инвесторов на внешнеторговые конфликты практически по всему миру, которые, как они ожидают, в итоге приведут к замедлению темпов роста ВВП США и вынудят ФРС США снизить ключевую процентную ставку. Это прозвучало от представителей ФРС США не один раз, до этого о необходимости смягчения монетарной политики говорил Джеймс Буллард. По оценкам экспертов JPMorgan Chase & Co., доходность 10-летних казначейских облигаций США составит 1,75% к концу текущего года вместо ранее ожидавшихся 2,45%. При этом ожидается, что ВВП США, как это ни странно, всё равно увеличится во втором квартале текущего года, но всего на 1%, а в третьем квартале – на 1,5%. Относительно уровня ставки ФРС США и количеств её пересмотра они утверждают, что ставка может быть понижена на 0,25 процентного пункта в сентябре и в декабре этого года. Вот так.\r\n\r\nТак что, не обращая внимания на торможение мировой экономики и невзирая на риски рецессии в США и всей мировой экономики, американский рынок может ещё раз вырасти. А вот что будет потом – вопрос очень спорный. Ведь снова звучат данные о том, что рост деловой активности в сфере услуг в Поднебесном Китае в очередной раз замедлился. Судя по последним данным от исследовательской компании IHS Markit и Caixin Media Co., рост деловой активности в сфере услуг достиг минимума за три месяца на фоне существенного замедления роста экспортных заказов, падение которых происходит на фоне внешнеторгового противостояния в мировой экономике. \r\n\r\nВозможно до саммита стран формата «Большой Двадцатки – G20» мы ещё столкнёмся и с ростом на американском фондовом рынке, который может базироваться на ожиданиях глобальных инвесторов о возможной разрядке на мировой торговой, экономической и политической аренах. Но если этого не произойдет, то риск падения ниже уровней прошлого декабря будет просто крайне высоким. Следом за ним придёт общее ожидание рецессии в Америке и прочие радости глобального рынка капитала. \r\n\r\nВсем успешных инвестиций и следите за рисками. Есть риск роста американского рынка до уровней на отметках 2 888,82 – 2 929,29 пунктов по Индексу широкого рынка Standard & Poor’s 500.”,“backgroundUrl”:“https:\/\/mfc.group\/upload\/iblock\/238\/rost_sostoyalsya.jpg”,“dateTime”:“05.06.2019 12:49:25”,“showCounter”:“18”,“author”:“32”,“detailPageUrl”:“https:\/\/mfc.group\/analitika\/trend\/rost-kotoryy-dolzhen-byl-sostoyatsya-sostoyalsya\/”}\n\n"] print 1

текст из ошибки выше выкладывал


#31

Советую ещё раз посмотреть мой пример и поискать ошибку :slight_smile:


#32

Блин, что, я был не внимателен?


#33

Я такого не писал.



#34

и

DispatchGroup().enter()

разве не одно и то же?


#35

Нет, так вы делаете много экземпляров DispatchGroup.


#36

Действительно. Поправил. Запустил. Все-равно крашится на строке с group.leave() c ошибкой
Thread 3: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

но прогресс есть: на принте при вызове функции появились данные, но только из одного элемента

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


#37

Поправить нужно не в одном месте, а точно так как в моём примере.

let group = DispatchGroup()
group.enter()
group.leave()
group.notify(queue: .main) {
}

#38

group я поправил везде. нужно ли и переменную i убирать из цикла? Тогда что отдавать в ссылку для запроса? я же делаю несколько запросов, подставляя туда ID статей из заранее приготовленного массива с айдишниками. Или речь не об этом?


#39

Покажите код, или лучше проект суда скиньте.

Представьте что DispatchGroup это счетчик, group.enter это + 1, group.leave - 1, как значение равно 0, срабатывает group.notify.


#40

Именно так и сделал
Перепроверил уже дважды и запустил. Падает программа