서버용 스위프트에서 MongoDB 와 Perfect 사용해서 Collection 수가 replyInt 로 나와서 처리가 힘들때

서버용 스위프트로 모듈을 만들때이다. 보통 API 를 만들때 사용한다. 데이터베이스는 MongoDB를 사용했다. 웹서버 모듈은 Perfect 를 사용했고 디비연결은 PerfectMongoDB를 사용했다. 문제는 컬렉션의 수를 셀때이다. 결과 값이 replyInt(500) 이런식으로 나온다. 이를 Int 로 변경해야 처리가 편한데....., 검색해보니 나오지 않는다. 어쩐다...., let countResult = collection.count(query: bson) if case .replyInt(let count) = countResult {   // 여기서 count 가 Int 이므로 처리하면 된다.   print("count \(count)") } 이 방법을 사용하면 카운트의 수를 가져올 수 있다. 처음에 이게 안되어서 find 결과를 세었는데  수가 많아지면 너무 오래 걸려서  결국은 count 를 사용할 수 밖에 없다.

swift pickerView toolbar > uiconstraintbasedlayoutdebugging 오류 추적

일단 화면에 PickerView 가 있다. 그리고 그 위에 ToolBar 를 추가하여 확인 버튼을 달았다. 하지만 실행하면 uiconstraintbasedlayoutdebugging 오류가 생성되었음. let toolbar = UIToolbar () toolbar. barStyle = . default toolbar. isTranslucent = true toolbar. tintColor = . black toolbar. sizeToFit () let flexBarButton = UIBarButtonItem (barButtonSystemItem: . flexibleSpace , target: nil , action: nil ) let doneBarButton = UIBarButtonItem (title: "확인" , style: . plain , target: self , action: #selector ( endEditing )) toolbar. items = [flexBarButton, doneBarButton] toolbar. isUserInteractionEnabled = true          birthYearTextField . inputAccessoryView = toolbar cityTextField . inputAccessoryView = toolbar 일단 소스는 위와 같이 추가하였음. 검색을 해보니 툴바와 피커뷰를 같이 생성하라고 하는 등등.... 모두 안되었다. 아래와 같이 하니까 오류 없이 잘 된다. let toolbar = UIToolbar (frame: CGRect (x: 0 , y: 0 , width: UIScreen . main . bounds . width , height: 37 )) 즉, 툴바를 생성할 때 크기를 지정해주면 된다.

whose view is not in the window hierarchy

swift 5로 코드를 작성 중이었다. self.performSegue(withIdentifier: "ResultToMainSegue", sender: nil) 이 코드가 실행 되면서 나는 오류이다. 그냥 버튼에 이벤트로 적용하면 잘 되는데... 구글 애드몹을 적용하여 광고를 시청하고 끝나는 시점에 넣으니 오류가 난다. whose view is not in the window hierarchy 검색해보니 대충 이게 첫번째 뷰가 아니어서 그런다 첫번째 뷰를 찾아서 거기서 명령을 실행해야 한다고 한다. 그렇게 해보았다. 역시 되지 않는다. 내가 해결한 방법은 이것이다. DispatchQueue.main.async {   self.performSefue(withIdentifier: "ResultToMainSegue", sender: nil) } 이렇게 하니 잘된다. 현재 뷰에서 광고뷰로 넘어가고 다시 현재 뷰로 넘어오면서 뷰의 계층 구조가 명확히 정립되지 않은 상태에서 메인창을 호출하니 오류가 날때도 있고 아닐때도 있었을꺼 같다. 항상 기초에 충실해야겠다.

MySQL Multiple rows 를 one query 구현하기

MySQL 에 자료를 갱신할 일이 생겼다. 갱신할 자료를 가져와 배열에 담았다. list = [adm, bay, car, del, ear] 이를 반복하면서 Update 를 했더니 오래 걸린다. 자료가 약 300 ~ 400 개인데 3~4초가 나온다. 검색을 해보니 INSERT INTO tb_temp (a, b, c) VALUES(1, 2, 3) ON DUPLICATE KEY UPDATE c = c + 1 이걸 이용하면 된다고 한다. 뭐 반복문 돌면서 sql 하나의 문자열로 만들었다. 디비 결과는 중복 입력이었다. 다시 검색을 해보니 비교로 사용하는 첫번째 항목은 무조건 Primary 이어야 한다고 한다. 디비의 구조를 변경하였다. 다시 실행해보니 중복 없이 잘 갱신된다. 실행속도도 400개 정도가 1초 이내로 나온다.

swift Kuery mysql Error shim.h & mysql.h 대응 방법

리눅스에서 스위프트로 작성한 앱에서 MySQL 접속할 일이 생겼다. Swift-Kuery & SwiftKueryMySQL 을 추가하면 된다고 하여 추가하였다. Package.swift 파일에 두개의 모듈을 추가하고 $ swift package update 를 한 다음 혹시나 하여 컴파일을 해 본 다음에 진행하자 $ swift build 결과가 에러를 토해 내였다. <module-includes>:1:10: note: in file included from <module-inclues>:1: #include "shim.h> ~~~~ # error: 'mysql.h' file not found 대충 이런식이다. 해결 방법은 mysqlclient 관련 모듈이 없어서 나는 오류이다 $ sudo apt-get install libmysqlclient-dev 설치 한 후 컴파일 하니 오류가 나지 않는다.

Swift Cocoa FileManager 사용시 Operation not permitted 오류 대처

이미지
Swift 에서 파일을 가져와서 수정할 일이 있어서 FileManager 를 이용하여 파일을 가져오는데 Operation not permitted 오류가 나는 것이다. 보통 아이폰에서는 샌드박스 디렉토리 구조라 그런 오류가 나는데 코코아는 컴퓨터에서 파일을 접근하는게 아닌가? 대부분의 검색은 이 오류에 대한 내용이 없다. 내가 찾은 방법은 다음과 같다. 이것도 겨우 찾은 방법이다. Xcode - project - target - Capabilities - App Sandbox - Off 예전에 없는 기능이 추가로 생긴거 같다. 그것도 Default로 On 이 되어 있음.

단독망에서 Kitura 사용하는 방법

외부망이 연결되어 지지 않는 네트워크가 많다. 보통 보안이라는 이름으로 그렇게 구성되어 있다. 그렇다고 저장소(일단 Repository)를 연결해주지 않는다. 해당 업데이트 들은 CD 로 구워서 이동해야 한다. 그러면서 백신 검사는 한다고 한다. 리눅스 바이러스까지 잡는 V3 대단해요..ㅋㅋ 이런 상황에서 Kitura 를 운영하고 싶다면 먼저 걸리는게 있을 것이다. swift package update 를 하면 외부 저장소가 연결되지 않아 관련 모듈 설치가 안된다. 난 이런 경우 이렇게 해결한다. 일단 외부 연결이 되는 곳에서 해당 파일을 추가하고 업데이트를 한다. $ vi Package.swift .package(url: "https://gitbub.com/IBM-Swift/Kitura", from: "2.7.0") 추가한 다음에 하단에 타켓에 해당 내용을 추가해줘야 한다. 보통 이것을 빼먹어서 오류가 난다. .target(name: "app_name", dependencies: ["Kitura"]) 이제 패키지를 업데이트 한다. $ swift package update 뭐라 업데이트를 많이 한다. 관련 모듈까지 하기 때문이다. 이때 나오는 문구를 잘 적어 두어야 한다. 특히 각 모듈의 버전들..... 이것 때문에 설정이 아주 복잡해질 수 있다. 업데이트가 완료되면 $ cd .build $ cd repositories $ ls 방금 업데이트 한 관련 모듈이 이곳에 다 있다. 이 폴더를 통째로 복사하여 단독망으로 이동하면 된다. 나의 경우는 해당 모듈의 뒷부분은 전부 자르고 이동했다. $ mv Kitura--70115644 Kitura 단독망에서는 이렇게 사용했다. $ mkdir app_name $ cd app_name $ swift package init --type executable 폴더가 만들어지면 이곳에 re...