为什么nsurlsession.datataskwithrequst被取消了

时间:2016-06-14 14:34:25

标签: ios swift nsurlsession rx-swift

我在RxSwift上使用nsurlsession。 关于RxSwift的nsurlsession我面临两个问题。 我创建了Custom Observable。 这个Observable使用了nsurlsession。 每次在RxSwift上取消nsurlsession.datataskwithrequst。 我的代码在这里

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()}
    }
}

上面的方法被称为。

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)



}

我的订阅就在这里。

/**
 検索件数を取得

 - 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)

}

我有两个问题。

1:每次都取消了nsurlsession。我不知道原因。

2:即使我在NSURLSession上出错,我也无法在&#34; CatchError&#34;上找到错误。

顺便说一下,当我尝试使用以下代码时,可能会取消nsurlsession。

这可能是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)

}

这是什么问题?

1 个答案:

答案 0 :(得分:0)

我可以自己解决。 以上方法没有任何问题。 下面的代码有问题。

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

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


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

我在Class上定义了searchViewModel,我可以解决。