1

I am using nsurlsession on RxSwift. I am facing two problems about nsurlsession on RxSwift. I created Custom Observable. This Observable has used nsurlsession. nsurlsession.datataskwithrequst was canceled everytime on RxSwift. My code is here

func getWorkInfo(request:NSURLRequest,type1:C.Type,type2:W.Type? = nil) -> Observable<(C?,[W]?, NSHTTPURLResponse)>{

    return Observable.create { observer in

        var d: NSDate?

        if Logging.URLRequests(request) {
            d = NSDate()
        }

        let session = NSURLSession.sharedSession()   
        let task = session.dataTaskWithRequest(request) { (data, response, error) in
            guard let response = response, data = data else {
                ColorLogger.defaultInstance?.error(error)
                observer.on(.Error(error ?? RxCocoaURLError.Unknown))
                return
            }

            guard let httpResponse = response as? NSHTTPURLResponse else {
                observer.on(.Error(RxCocoaURLError.NonHTTPResponse(response: response)))
                return
            }

            guard let jsonString: String = NSString(data:data, encoding:NSUTF8StringEncoding) as? String else{
                observer.on(.Error(ApiError.FormatError))
                return
            }

            //カウント系
            let countObj = Mapper<C>().map(jsonString)
            //一覧系
            //二つ目を指定してない場合はnilを返す
            if type2 != nil{
                let aryObj = Mapper<W>().mapArray(jsonString)
                observer.on(.Next(countObj,aryObj, httpResponse))
            }else{
                observer.on(.Next(countObj,nil, httpResponse))
            }

            observer.on(.Completed)

        }


        let t = task
        t.resume()

        return AnonymousDisposable{task.cancel()}
    }
}

Above method was called by here.

func getWorkCount(dicParam: NSDictionary) -> Observable<WorkCount?> {

    // URL作成
    let strParam = dicParam.urlEncodedString()
    let strUrl = Const.ShiftApiBase.SFT_API_DOMAIN+Const.ApiUrl.WORK_COUNT+"?"+strParam


    // 求人リストデータを取得
    let url = NSURL(string: strUrl)!
    let request = NSURLRequest(URL: url)
    let client = WorkClient<WorkCount,Work>()
    ColorLogger.defaultInstance?.debug(strUrl)
    return client.getWorkInfo(request, type1: WorkCount.self)
        .observeOn(Dependencies.sharedDependencies.backgroundWorkScheduler)
        .catchError{(error) -> Observable<(WorkCount?,[Work]?, NSHTTPURLResponse)> in
            print("error")
            ColorLogger.defaultInstance?.error("UnknownError")
            return Observable.empty()

        }
        .map { countObj,workObj,httpResponse in

            if httpResponse.statusCode != 200 {

                throw ApiError.Bad

            }
            return countObj

        }
        .observeOn(Dependencies.sharedDependencies.mainScheduler)



}

And My subscribe is here.

/**
 検索件数を取得

 - parameter param: <#param description#>
 */
func getSearchCount(param: [String:String]){
    let dicParam = NSDictionary(dictionary: param)
    api.getWorkCount(dicParam)
        .catchError{
            error -> Observable<WorkCount?> in
            switch error{
            case ApiError.Bad:
                ColorLogger.defaultInstance?.error("status error")
                break
            case ApiError.FormatError:
                ColorLogger.defaultInstance?.error("FormatError")
                break
            case ApiError.NoResponse:
                ColorLogger.defaultInstance?.error("NoResponse")
                break
            default:
                ColorLogger.defaultInstance?.error("UnKnownError")
                break
            }


            return Observable.just(nil)
        }
        .subscribeNext { [weak self] countObj in
            self?.count.value = countObj?.returned_count
        }
        .addDisposableTo(disposeBag)

}

I have two problems.

1:nsurlsession was canceled every time.I don know reason.

2:Even if I got error on NSURLSession,I could not catch error on "CatchError".

By the way,when i try to use the following code,But nsurlsession might be canceled.

It might be a base nsurlsession on RxSwift.

func getWorkCount4(dicParam: NSDictionary) -> Observable<WorkCount?> {

    // URL作成
    let strParam = dicParam.urlEncodedString()
    let strUrl = Const.ShiftApiBase.SFT_API_DOMAIN+Const.ApiUrl.WORK_COUNT+"?"+strParam


    // 求人リストデータを取得
    let url = NSURL(string: strUrl)!
    let request = NSURLRequest(URL: url)
    let session = ApiBase.sharedObj.createNSURLSession()
    return NSURLSession.sharedSession().rx_response(request)
        .observeOn(Dependencies.sharedDependencies.backgroundWorkScheduler)
        .map { data,httpResponse in

            if httpResponse.statusCode != Const.HTTP_RESPONSE.HTTP_STATUS_CODE_OK {
                throw ApiError.Bad
            }

            guard let jsonString: String = NSString(data:data, encoding:NSUTF8StringEncoding) as? String else{
                throw ApiError.FormatError
            }

            let countObj = Mapper<WorkCount>().map(jsonString)
            return countObj

        }
        .observeOn(Dependencies.sharedDependencies.mainScheduler)

}

What is this problem?

1 Answers1

0

I could resolve by myself. Above method does not have any problem. Below code has problem.

// MARK: - 検索カウント
extension SearchCount{

/// 検索用のViewModel
var searchViewModel:SearchViewModel {
    return SearchViewModel()
}


/**
 検索の件数を取得
 */
func getSearchCount(){
    setApiParameter()
    searchViewModel.getSearchCount(apiParam)
}
}

I defined searchViewModel on Class,the i could resolve.