2016년 4월 21일 목요일

swift 에서 URLRequest, JSON 파싱 (REST API 클라이언트 개발)

2013년 앱개발 알바를 할때는 다음과 같은 기록을 남겼다.

http://mtsparrow.blogspot.kr/2013/04/ios-json.html

2016년 swift 에서는 어떻게 해야 하는가?

http://mtsparrow.blogspot.kr/2016/03/cocoapod.html

코코아 팟을 이용해서 오픈 소스 중에 JSON과  URLRequest를 편리 하게 해주는
오픈 소스 두개를 추가 한다.

SwiftyJSON
https://github.com/swiftjson/SwiftJson


Alamofire

https://github.com/Alamofire/Alamofire


다음은 간단한 예제 코드이다.

    var arrRes = [[String:AnyObject]]() // Array of dictionary
    var reqParam = [ String:AnyObject]()


func RequestRestAPI() {
        // 요청 키 밸류
        reqParam = [
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--"
        ]
        
        print(reqParam)
        

        ActIndicator.startAnimating() 
        Alamofire.request(.POST, "https://URL~~~blahblah/api/", parameters: reqParam).responseJSON { (responseData) -> Void in
            self.ActIndicator.stopAnimating()
            if responseData.result.value != nil {
                let swiftyJsonVar = JSON(responseData.result.value!)
                
                print(swiftyJsonVar["result"])
                print(swiftyJsonVar["message"])
                if swiftyJsonVar["result"].stringValue == "true" {
                    if let resData = swiftyJsonVar["data"].arrayObject {
                        self.arrRes = resData as! [[String:AnyObject]]
                    }
                    print(self.arrRes)
                    
                    // 응답 성공 arrRes에  딕셔너리에서 결과 키 밸류를 이용해서 처리 한다.
                    
                } else {
                    // 에러 응답 처리
                }
            } else {
               // 네트워크 에러 처리

            }
        }

    }


간단하게 설명을 하자면

ActIndicator.startAnimation()은 엑티비티 인디케이터를 네트워크 시작시 에니메이션을 시작 한다.

Alamofire.request 로 REST API에 URL을 주고 reqParam으로 정의된 키벨류를 전달 한다.

네트워크 요청이 완료되면 Alamofire.request의 블럭 코딩 부분이 수행되며 액티비티 인디케이터 에니 메이션을 종료 하고 SwiftyJSON을 이용한 결과 데이터를 얻어내면 된다.

위 예제는 응답 결과를 JSON을 받고 약속된 프로코톨로 result, message, data 키로 받게 되어 있다.
REST API마다 JSON의 형태는 다를 것이고 이경우 result, message, data는 동일 하며
data의 형태는 다시 키벨류 쌍으로 REST API tag의 따라 다양하게 정의된 경우 이다.

// 응답 성공의 경우 data의 arrayObject를 self.arrRes에 할당 했으며 데이터 타입은 String:AnyObject이다.

정의된 String Key로 값을 접근하면 된다.


swift 아이콘 라벨 컴퍼넌트





위와 같은 화면 중 하단 위치 표시 아이콘과 '효성2동 계양구'를 표시하는 부분을 구현 한다면

어떻게 해야 하는가?

레이블은 항상 센터 정렬이고 글자 수는 어떻게 될지 모른다.

복잡한 주소에 경우 글이 많아질 수 있고 글이 상대적으로 짧을 수 있다.

이런 경우 항상 레이블 앞에 이미지 아이콘을 표시 하려면

이러한 기능을 해주는  IconLabel 클래스 소스 코드 이다.
https://github.com/sparrowapps/swiftCustomControls/blob/master/IconLabel.swift


UILabel을 상속 받은 새로운 레이블 컴퍼넌트에 프로퍼티로 아이콘과
아이콘의 위치 Left, Rigth 등을 설정 할 수 있는

커스텀 컴퍼넌트 이다.

2016년 4월 14일 목요일

swift 2.0 code to swift 2.2

겨울 내내 작업한 프로젝트 xcode 7.3으로 업그레이드를 해야 하나 말아야 하나?
하면 swift 2.0에서 2.2로 변경되면 어떤 일들이 벌어지나?

대충 100여개의 워닝이 발생 하는데

주로 for 문 과 selector 관련 구문이다.

action: 에 연결한 함수이름 "" 가 모두 워닝이 나더라

아래의 코드 처럼 xcode 에서 자동으로 더블클릭 하고 fix it 눌러주면 #selector()  속에 클래스이름의 이벤트 함수로 변환되서 잘 된다.
let keypadDoneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "pointDoneClick")
to
let keypadDoneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(PaymentViewController.pointDoneClick))

C style for문은 swift 3.0에서 아에 못 쓰게 된다. 그래서 워닝이 잔뜩 난다.
나처럼 올드한 C개발자 출신이 주로 이용하는 코드들이라서리..
다음과 같이 변환 하면 {이하는 바꿀 필요 가 없다. 

for (var i=0; i < payButtons.count ; i++ ) {
            payButtons[i].enabled = enabled
}

to

for i in 0 ..< payButtons.count {
            payButtons[i].enabled = enabled
}


 그리고 tip  하나 투척 cmd + b로 빌드를 해보면 swift 2.2에서 엄청나게 많은 워닝이 쏟아지고
대부분 이렇게 selector 관련 워닝일경우 자동으로 xcode 에서 수정 해줘도 무방 할 경우는 

다음의 단축키가 유 용 하다.


cmd + ' 은 다음 워닝이고
cmd + "" 는 이전 워닝

Ctrl + Cmd + ' 은 다음으로 넘어가면서 이러한 워닝을 2.2 코드에 맡게 변환해 준다.

반대로 이전으로 넘어가면서 변환은 Ctrl + Cmd + " 이다.


2016년 4월 13일 수요일

mac pycharm + ananconda 환경 설정 하기

https://www.continuum.io/downloads

파이썬 패키지모음으로 ananconda가 있다.

os x  내장 파이썬은
sparrow-mac-mini2:Versions sparrow$ ls
2.3 2.5 2.6 2.7 Current
sparrow-mac-mini2:Versions sparrow$ pwd
/System/Library/Frameworks/Python.framework/Versions

sparrow-mac-mini2:Versions sparrow$ 

이렇게 다양한 버젼이 설치 되어 있다.

ananconda 3.4 버젼을 설치 하고

https://www.jetbrains.com/pycharm/download/

무료 IDE CE 버젼을 내려 받을 수 있다.



Preference -> Project -> Project Interpreter 
여기서 3.4 anaconda를 선택 하면 ananconda 파이썬을 인터프리터로 설정 하여 사용 할 수 있다.

2016년 4월 3일 일요일

iOS 개발시 사용한 sqlite 데이터베에스 파일을 mac으로 가져오려면?

https://github.com/FahimF/SQLiteDB

를 이용해서 app에서  swift언어와 함께 sqlite를 손쉽게 이용할 수 있다.

어떠한 문제에 의해서 앱에서 저장되는 데이터를 mac에서 분석 해야 하는 일이 생길 수 있다.

sqlite3를 이용해서 터미널에서 .db 파일을 생성 하고 ( 테이블 스키마 구성)
해당 파일을 프로젝트에 추가 하여 앱을 작성 하면
해당 데이터베이스 파일은 앱과 함께 아이폰 디바이스에 들어가서 동작 한다.

앱이 특정 작업을 수행하면서 데이터베이스를 갱신하고 많은 일을 처리 한다음
해당 데이터베이스 파일을 다시 맥으로 가져오고 싶을 때

itunes에서 해당 앱을 선택 하면 데이터베이스 파일이 보이고 손쉽게 내려 받을 수 있는
방법이 필요 하다.

itune에 연결하면 도큐먼트 파일이 보이는 앱은 어떻게 만드는가?



info.plist에 위와 같이 Application support iTunes file sharing YES 로 설정 하면 끝이다.

info.plist 파일을 source code로 열면 다음과 같다.
<key>UIFileSharingEnabled</key>
<true/>

이렇게 info.plist를 수정한 앱을 수행시키고 itunes에 연결 하면 해당 앱을 선택 하면 sqlite 데이터 베이스 파일이 보이고 itunes를 통해서 내려 받을 수 있다.