2016-06-14 3 views
0

RxSwiftでnsurlsessionを使用しています。 RxSwiftのnsurlsessionに関する2つの問題に直面しています。 私はCustom Observableを作成しました。 このObservableはnsurlsessionを使用しています。 RxSwiftで毎回nsurlsession.datataskwithrequstがキャンセルされました。 私のコードはここで呼ばれていたここになぜ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) 

} 

私には2つの問題があります。

1:nsurlsessionは毎回キャンセルされました。理由はわかりません。

2:私はNSURLSession上のエラーを得た場合でも、私は「CatchError」でエラーをキャッチすることができませんでした。

ところで、私は次のコードを使用しようとすると、しかし、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) 

} 

この問題は何ですか?

+0

'getWorkCount'から返された観測値にはどこで' subscribe'しますか? – dpassage

+0

質問を更新します。 –

答えて

0

私は自分で解決することができます。 上記の方法は問題ありません。 以下のコードに問題があります。

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

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


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

私はクラスでsearchViewModelを定義しましたが、私は解決できました。

関連する問題