Задать вопрос
  • Как сетевая карта определяет какой код исправления ошибок использовать?

    saboteur_kiev
    @saboteur_kiev Куратор тега Компьютерные сети
    software engineer
    1. Есть стандарты для протоколов низкого уровня. Для ethernet это вроде IEEE_802.3 - там описаны и структура пакетов и алгоритмы как работать с CRC. Сетевая карточка умеет работать с этими пакетами.

    2. 3. 4. https://en.wikipedia.org/wiki/Network_processor Все обрабатывается микрокодом процессора карточки, там есть и поддержка стандартов и самое начало, когда два устройства договариваются друг с другом о протоколах передачи и так далее. Физический адрес - это как раз то, о чем знает сетевая карточка еще до операционной системы.
    На сетевой карте есть чипсет. От него зависит в том числе и скорость работы. например в свое время 100мбитные карточки были заметно дороже 10мбитных именно из-за более дорогого чипсета, коториый бы успевал обрабатывать пакеты. А серверные карточки брали на себя много полезных вещей, до того как информация уходила уже в драйвер tcp на основной процессор.
    Ответ написан
    Комментировать
  • Как работают вложенные функции?

    doublench21
    @doublench21 Куратор тега Swift
    Доброго времени суток. Вопрос немного странный.

    Вопрос 1
    Достаточно зайти вот сюда и обнаружить, что метод auth всего лишь возвращает инстанц класса FIRAuth Собственно все ваши currentUser тут присутствуют. Думаю теперь вопросов быть не должно.
    spoiler
    @implementation FIRAuth {
      /** @var _currentUser
          @brief The current user.
       */
      FIRUser *_currentUser;
    
      /** @var _firebaseAppName
          @brief The Firebase app name.
       */
      NSString *_firebaseAppName;
    
      /** @var _listenerHandles
          @brief Handles returned from @c NSNotificationCenter for blocks which are "auth state did
              change" notification listeners.
          @remarks Mutations should occur within a @syncronized(self) context.
       */
      NSMutableArray<FIRAuthStateDidChangeListenerHandle> *_listenerHandles;
    
      /** @var _keychain
          @brief The keychain service.
       */
      FIRAuthKeychain *_keychain;
    
      /** @var _lastNotifiedUserToken
          @brief The user access (ID) token used last time for posting auth state changed notification.
       */
      NSString *_lastNotifiedUserToken;
    
      /** @var _autoRefreshTokens
          @brief This flag denotes whether or not tokens should be automatically refreshed.
          @remarks Will only be set to @YES if the another Firebase service is included (additionally to
            Firebase Auth).
       */
      BOOL _autoRefreshTokens;
    
      /** @var _autoRefreshScheduled
          @brief Whether or not token auto-refresh is currently scheduled.
       */
      BOOL _autoRefreshScheduled;
    
      /** @var _isAppInBackground
          @brief A flag that is set to YES if the app is put in the background and no when the app is
              returned to the foreground.
       */
      BOOL _isAppInBackground;
    
      /** @var _applicationDidBecomeActiveObserver
          @brief An opaque object to act as the observer for UIApplicationDidBecomeActiveNotification.
       */
      id<NSObject> _applicationDidBecomeActiveObserver;
    
      /** @var _applicationDidBecomeActiveObserver
          @brief An opaque object to act as the observer for
              UIApplicationDidEnterBackgroundNotification.
       */
      id<NSObject> _applicationDidEnterBackgroundObserver;
    }

    Представить это можно так:
    class Auth {
     class func auth() -> FIRAuth { ... }
     ...
    }
    
    class FIRAuth {
      var currentUser: FIRUser?
      ...
    }
    
    class FIRUser {
     var providerData: [Int : {что-то}]
     ...
    }
    
    Auth.auth().currentUser?.providerData[indexPath.row]


    Вопрос 2
    Кажется ещё более странным. Вы ведь знаете что такое опционал?! Тогда неужели Вы забыли, что метод может возвращать любое значение, в том числе и опционал. Теперь становится ясно, что с любым опционалом мы также можем применить опциональную цепочку, что собственно тут и было сделано.
    FUIAuth.defaultAuthUI() возвращает опционал. Почему бы и не продолжить цепочку. Продолжаем:
    FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication)
    Но как не странно этот метод тоже возвращает опционал и мы просто хотим себя от этого обезопасить и сказать, что если на последнем методе тоже будет опционал, то верни правую часть, то бишь false. В итоге получаем общую картину:
    FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication) ?? false
    Ответ написан
    2 комментария
  • Не совсем понимаю принцип вычисляемых свойств?

    @freeg0r
    .. some dude ..
    Каждая переменная класса имеет выделенных для нее память, а computed properties не имеют. В геттере и сеттере вы просто определяете какое то выражение, которое выполняется в при соответствующей операции. Хороший пример со временем:
    class Time {
        var seconds:Double = 0
        
        init(seconds: Double) {
            self.seconds = seconds
        }
        
        var minutes: Double {
            get {
                return (seconds / 60)
            }
            set {
                self.seconds = (newValue * 60)
            }
        }
        
        var hours: Double {
            get {
                return (seconds / (60 * 60))
            }
            set {
                self.seconds = (newValue * (60 * 60))
            }
        }
        
        var days:  Double {
            get {
                return (seconds / (60 * 60 * 24))
            }
            set {
                self.seconds = (newValue * (60 * 60 * 24))
            }
        }
    }


    Просто абстракция, можно использовать конечно и функцию вместо этого, но так в некоторых случаях более "элегантно" что ли..
    Хороший промер есть ещё в iBook Swift книге с прямоугольником.
    Ответ написан
    4 комментария
  • Не могу разобрать JSON?

    doublench21
    @doublench21 Куратор тега Swift
    Оратор выше прав. То что Вы сюда скинули - невалидный JSON. Скиньте валидный, продолжим беседу.

    Update: Ужасный JSON
    5b1b987d18d82129205780.png

    А это за чем???
    init(animal_title: [String], animal_about: [String]){
        self.animalName = animal_title
        self.animalAbout = animal_about
    }
    
     private enum CodingKeys: String, CodingKey {
            case animalName = "animal_title"
            case animalAbout = "animal_about"
        }


    Уже давно можно делать так:
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    Ответ написан
    1 комментарий
  • Как вызвать alert с запросом на разрешения использования Touch ID и FaceID?

    briahas
    @briahas
    ObjC, Swift, Python
    В смысле "заранее"? Вы же только что сказали что "при первом входе в приложение вызывается системный alert". Когда ж еще заранее?

    Ответ: Для того чтобы запросило разрешение, надо после включения опции в настройках сразу запустить тачАйДи. Иначе - не запросит
    Ответ написан
    2 комментария
  • Как спрятать данные, находящиеся в CoreData?

    @Statusgman
    iOS developer
    Посмотрите на Encrypted Core Data SQLite Store.
    Это кастомная реализация persistent store, файл БД при его использование содержит зашифрованные данные.

    У этой библиотеки есть проблемы с производительностью определенных запросов, стоит это учитывать, например, при использовании NSFetchedResultsController с большим объемом данных, разбитых по секциям.
    Ответ написан
    Комментировать
  • Как спрятать данные, находящиеся в CoreData?

    maximglobak
    @maximglobak
    iOS developer
    Один из вариантов сделать прослойку для общения со своей БД и внутри нее шифровать данные, а когда запрашиваете данные, то дешифруете обратно их.
    Можно обратить внимание на Realm БД, которая может это делать из коробки или почти из коробки.
    Ответ написан
    4 комментария
  • Как сделать фотографию программно, не вызывая камеру?

    maestrro712
    @maestrro712
     iOS Developer
    Это можно сделать, но только когда приложение активно. Работу с камерой надо вести через AVFoundation. Тема довольно сложная, чтобы ее сейчас расписывать, погуглите "AVFoundation capture session"
    Ответ написан
    Комментировать
  • Как ввести пароль в системное уведомление, когда FaceID не сработало?

    doublench21
    @doublench21 Куратор тега Swift
    https://www.prolificinteractive.com/2015/01/26/tut...

    Думаю тут вы найдёте все волнующие Вас вопросы, в том числе и проверку пароля.

    Для начала переходим сюда и смотрим:
    case deviceOwnerAuthenticationWithBiometrics
    Indicates that the device owner must authenticate using biometry. // Юзаем только биометрию
    
    case deviceOwnerAuthentication
    Indicates that the device owner can authenticate using biometry or the device password. //Юзаем биометрия и если её нет, то Пароль
    Подробности по каждому из методов можно найти там же. Подробности 2ого варианта

    У тебя в коде 1ый варинт, сменим на 2ой:
    if contex.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) {
                contex.evaluatePolicy(LAPolicy.deviceOwnerAuthentication, localizedReason: "Use TouchID", reply: { wasSuccessful, _ in
    
                    if wasSuccessful {
                        print("Все получилось")
                        let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
                        let homeVC = mainStoryboard.instantiateViewController(withIdentifier: "HomeVC")
                        self.navigationController?.pushViewController(homeVC, animated: true)
                    } else {
                        print("Что-то пошло не так")
                    }
                })
            }

    При таком подходе, появится следующее:5aa933ca7eb2a419650612.jpeg

    Ну и забыл добавить, если тип проверки оставить неизменным, то есть 1ый способ, то при нажатии на кнопку ввести пароль нужно ловить ошибку типа . userFallback

    При таком подходе после того как Вы отловили, вы уже сами вольны делать все что угодно. Выводить контрол или ещё что. НО, вывести экран с кнопками для ввода пинкод сами Вы не можете. Нужно реализовать свой, либо найти готовый, коих можно найти. А лучше воспользоваться обычным аллертом с полем для ввода.

    Authentication was canceled because the user tapped the fallback button in the authentication dialog, but no fallback is available for the authentication

    Подробности тут https://developer.apple.com/documentation/localaut...
    Ответ написан
    2 комментария
  • Как в Firebase сделать многопользовательскую базу данных?

    RomReed
    @RomReed
    JavaScript, Flutter, ReactNative, Redux, Firebase
    При создании пользователя в ответ приходит разная информация но самая главная из них это уникальный ID. Вам никто не мешает сразу после успешной регистрации создать в базу ключи users/ id пользователя/ и положить нужные вам данные.

    export function registerUserWithEmailAndPassword(nickname, email, password) {
        return (dispatch) => {
            firebase.auth()
                .createUserWithEmailAndPassword(email, password)
                .then((user) => {
                    firebase.database()
                        .ref('usersChat/' + user._user.uid)
                        .set({
                            nickname: nickname,
                            uid: user._user.uid,
                            timestamp: Date.now(),
                            email: email
                        })
                    return user
                })
            
                .catch((error) => {
                    // Handle Errors here.
                    var errorCode = error.code;
                    var errorMessage = error.message;
                    dispatch({
                        type: types.userRegisterErr,
                        payload: errorMessage
                    });
                });
        }
    }
    Ответ написан
    4 комментария
  • С чего начать изучение парсинга на swift?

    doublench21
    @doublench21 Куратор тега Swift
    Вы хотите написать инструмент для парсинга или хотите научиться пользоваться инструментами для парсинга контента? Для первого Вам нужно разбираться хорошо, как уже писал человек выше, в dom, xpath и selectors. Если же вы хотите пользоваться инструментами, то углубляться в знания выше перечисленные не стоит. Тут нужно действовать по ситуации.

    Информация маленькая и добраться по дереву dom до него легко, тогда ваш случай это регулярки языка swift.

    Тк регулярный язык является подмножеством контекстно свободных языков и html является как раз одним из таких, регулярными выражениями не всегда удастся получить то что вы хотите. Для этих целей обычно используются готовые инструменты которые за вас разбирают dom. Вам лишь нужно указать селекторы и вы получите нужные данные. Гуглите, на swift такие библиотеки есть.

    Если информация которая Вам нужна подгружается динамически, то ответ от сервера содержать эти данные не будет, т.к. Js ещё не сработал, соответственно и инфа никакой нет. Для таких страниц нужно использовать веб-драйверы. Это некий браузер, которым вы управляете из кода. Гуглите Webdriver, Selenium, Chrome cli.
    Ответ написан
    3 комментария
  • Научиться парсингу - с чего начать?

    @throughtheether
    human after all
    С php не имел удовольствия работать, но поводу парсинга могу пояснить.
    Что вам, по большому счету, надо, так это:

    1) скачать страничку сайта или сделать вызов HTTP API. В этом вам помогут библиотеки вроде curl.

    2) разобрать полученные в п.1) данные. В случае API, как правило,это JSON. В случае HTML вам пригодится знание XPATH-выражений (которые также помогут, если в результате выполнения п. 1) вы имеете XML) и css-селекторов. Исполнять эти запросы будет XML- или DOM-парсер.

    3) полученные в п.2) данные сохранить в конечном или промежуточном виде: CSV, записи в RDBMS (sqlite, mysql, postgresql) или NoSql (Mongo, например)

    В дальнейшей работе помогут Selenium (или другой HTTP клиент с исполнением javascript), очереди заданий, кэширование (redis).

    Думаю, направление для поиска я вам задал.
    Ответ написан
    2 комментария
  • Как парсить сайты с помощью Swift?

    0xcffaedfe
    @0xcffaedfe
    Developer & Reverser
    Так-же как и на других языках. Искать паблик api если нет искать приватные, если и этого нет то разбирать странички.

    https://github.com/cezheng/Fuzi
    https://github.com/tid-kijyun/Kanna

    Тут можно натйи много чего интересного: www.swifttoolbox.io
    Ответ написан
    Комментировать
  • Почему происходит ошибка разворачивания инициализированного опционала,?

    А зачем вам здесь вообще Bool? понадобился?
    Если флаг успеха, то лучше var per2 = false.
    Ещё, у вас есть блок try-catch, но в нём ни одного try.
    Ещё, вы выводите не-развёрнутый Optional, о чём, к счастью, предупредит компилятор.
    Кроме того, у вас может произойти отказ в разных местах, так что стоит подумать над использованием ошибок / "исключений" Swift:

    func aaa() throws {
                let fetchResult = try PersistenceService.contex.fetch(fetchRequest)
    
                for item in fetchResult {
                    let per = item.password
                    guard let pass = per else {
                        throw AaaErrors.passwordNotCreated
                    }
                    print("пароль \(pass!)")
                }
        }
    Ответ написан
    Комментировать
  • Почему происходит ошибка разворачивания инициализированного опционала,?

    maestrro712
    @maestrro712
     iOS Developer
    Я вижу 2 случая, когда переменная не инициализируется:

    1. `fetch` произошел с ошибкой. Ошибка поймалась в `catch`, исполнение счастливо пошло дальше, но `per2` так и осталась не инициализированной
    2. массив `fetchResult` - пустой, тогда тело цикла не выполнится ни разу
    Ответ написан
    4 комментария
  • Почему происходит ошибка при отображение данных СoreData в TableView?

    doublench21
    @doublench21 Куратор тега Swift
    Ну так поставьте брейкпоинт на строку let sections2 = fetchedResultsController2.sections, пройдите её и выведите в консоли вот так e sections2 или e dump(sections2)
    Ответ написан
  • Как выгрузить в TableView Cells значения из разных сущностей CoreData?

    doublench21
    @doublench21 Куратор тега Swift
    В общем и целом Вы немного сами не понимаете чего хотите. Если у вас разные сущности CoreData, то должны быть и разные UITableViewCell для отображения данных разных сущностей. Тогда в методе
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    не возникнет труда понять, с какой сущностью Вы работаете сейчас, ведь у каждого типа UITableViewCell есть свой уникальный идентификатор. Ну а по нему Вы и сможете понять куда делать переход.
    Ответ написан
    3 комментария
  • Как изменить массив, чтобы цикл корректно сработал?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Задача решается вообще без массивов и цикла.
    Для начала определим, сколько раз будет полный проход Л-С-П-С:
    N := min(A, int(B/2), C);
    Количество съеденных к тому времени конфет будет N*4. Посмотрим, сколько конфет останется в вазах:
    A := A-N; B := B-N*2; C := C-N;
    N := N*4;

    Определим, на каком шаге ваза будет пустой и добавим съеденные конфеты:
    если A > 0 то 
        N := N+1;
        если B > 0 то
            N := N+1;
            если C > 0 то
                N := N+1;
    Ответ написан
    3 комментария
  • Как правильно передать значения в массив из другого VC?

    briahas
    @briahas
    ObjC, Swift, Python
    Могу только предположить, что у тебя постоянно создается либо масив, либо вьюконтроллер.
    Тут надо только дебажить код.
    Поставь брекпоинт на строчке ViewController2.list.append(per) и проверь значение list до исполнения этой строчки и после.
    Если на этом этапе все норм - иди назад по логике и ищи кто удаляет (создает заново массив) добавленные ранее значения.
    Ответ написан
    Комментировать
  • Как правильно передать значения в массив из другого VC?

    doublench21
    @doublench21 Куратор тега Swift
    Ты имеешь ввиду почему не сохраняются предыдущие добавленные строки в массиве? Если да, то любой вью контроллер создаётся и уничтожается по надобности. Ты переходишь на него, он создался. Уходишь с него, удалился(и данные в массиве тоже). Так что если тебе нужны все данные что были в UITextField и ты постоянно бегаешь туда сюда, то их надо где-то сохранять.

    Что бы вообще передавать данные между двумя вью контроллерами, есть такая вещь как делегаты. К примеру UITableViewDataSource/UITableViewDelegate. Но передача в методе prepare тоже вполне себе нормальный вариант.

    Если чего не понял, поясните.

    Пример того как могут общаться классы:
    dAll0IO.jpg
    Ответ написан
    2 комментария