Swift-Pomises로 Alam ofire 처리 지연 실현 [Swift1.1]

문제점


Swift의 iOS 애플리케이션 개발 중
Alamofire*1 또는 통신 시스템의 함수를 사용하는 경우
호출 내용의 실행이 통신을 끝냅니다
기다리지 않으면 다른 처리가 있다.
의도적인 처리를 실현할 수 없다. 예를 들어
다음 그림에서 보듯이 API 두드리기 결과는 다음과 같습니다.
테이블에 나타나지 않는 슬픈 사례*2도 볼 수 있다.

이런 사태에 대비해서.
javascript/jQuery 근처
Deferred 객체
상태를 사용하여 인스턴스의 가져오기를 모니터링합니다.
이번에는 이 Deferred 객체를 사용하도록 하겠습니다.
지연 처리를 실시하다.

골대


Alamofire 통신이 끝난 후
예기한 처리를 실행하다.

방침.


Deferred 객체를 사용합니다.
Deferred 객체는 처리할 수 없습니다.
진행 중/종료 후/이상 종료 상태
존재 여부를 감시하는 대상입니다.
통신이 끝날 때
완료 후
적어서 계속 처리하고 싶어요.
호출을 사용하면서 {통신}→{의도적 처리}의
순서대로 실현할 수 있다.
특히 jQuery에서 aax와 함께
자주 사용하는 대상입니다.

설치 내용


RokkinCat/Swift-Proomises*3에서
Classes 폴더 아래에 있는 Promise입니다.swift 열기
응용 프로그램 소스 코드에 추가합니다.
Promisses in Swift*4 아래 코드 1 참조func callAPI() -> Promise함수를 실현하였다.
code1
func uploadFile() -> Promise {
  let p = Promise.defer()
  dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
    {
        let success = self.actualFileUpload()
        if !success {
            p.reject()
        }
        dispatch_async(dispatch_get_main_queue(), {
            p.resolve()()
        })
    })
  return p
}
MyPageViewController.swift
...
    let deferred = Deferred()
...
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        callAPI().then{(value) -> () in
            self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
            self.tableView.reloadData()
        }
    }

    func callAPI() -> Promise{
        let promise = deferred.promise
        Alamofire.request(CRUDRouter.Read(routerName: "users/1/favorites", id: 0))
            .responseJSON { (_, _, JSON, _) in
                var arr : NSArray = JSON!["comment"]!! as NSArray
                for a in arr{
                    self.items.append(a["comment"]!! as String)
                }
                self.deferred.resolve("end API calling")
        }
        return promise
    }

결과 달성


다음 표에서
글이 추가된 화면
화면표시 후 0.2초가량 나온다.
Deferred가 설치되어 있지 않은 경우
탭에 두 번째로 보일 때.
처음 표시.
(TableView 설치 방법 정보
여기서 사랑을 끊는다.)

여기서는 Deferred를 사용합니다.
올바른 통신 → 처리 순서
실현 가능하다는 것을 확인했다.
표시된 텍스트는 앞의 것입니다
백엔드에서 HTTP Request 열기
건너뛰었어.

총결산


본 논문에서, 우리는 Alamofire 통신 후에 예상한 처리를 실행하기 위해 Deferred를 사용합니다.
필사적으로 노력했다.
나는 스위프트와 자바스크립트가 매우 비슷하다고 생각한다.
JSON을 호출한 API의 실현을 소개하는 글*5
네, 그런데 Alam ofire
API 주변을 깔끔하게 쓸 수 있도록, 이게 좋을 것 같아요.
나는 원가가 낮은 실복이라고 생각한다.
추가 Deferred 객체*6도 가능합니다.
이번에는 바로 찾은 물건으로 실시됐다.

참고 문헌

  • Alamofire/Alamofire
  • [Swift1.1] swift로api를 두드려 JSON을 지우고 표시하는 방법(xcode 6.1, iOS 8.1)
  • RokkinCat/Swift-Promises
  • Promises in Swift
  • swift JSON에서 API를 통해 얻은 JSON을 분석하고 UITObleView로 날씨 정보를 표시합니다.날씨 앱을 만들어 보세요.
  • [iOS] 호출지옥 탈출 프로그램 라이브러리 일람
  • Swift에서 iOS 개발: RSS 리더
  • 좋은 웹페이지 즐겨찾기