2013-06-20 49 views
1
-(void) conn:(NSString *)method{ 

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(concurrentQueue, ^{ 
    __block NSDictionary *resultBlock = nil; 
    dispatch_sync(concurrentQueue, ^{ 
     /* Download the json here */ 

     //Create webservice address 
     NSString *webService = [_baseURL stringByAppendingString:_webService]; 
     //NSLog(@"%@", webService); 
     //Create error object 
     NSError *downloadError = nil; 

     //Create the request 
     NSMutableURLRequest *req = [self initRequest:webService method:method]; 

     if(req != nil){ 
      //Request the json data from the server 
      NSData *jsonData = [NSURLConnection 
            sendSynchronousRequest:req 
            returningResponse:nil 
            error:&downloadError]; 

      if(downloadError!=nil){ 
       NSLog(@"DOWNLOAD ERROR %@", downloadError); 
      } 

      NSError *error = nil; 
      id jsonObject = nil; 

      if(jsonData !=nil){ 

       /* Now try to deserialize the JSON object into a dictionary */ 
       jsonObject = [NSJSONSerialization 
           JSONObjectWithData:jsonData 
           options:kNilOptions 
           error: &error]; 
      } 


      //Handel the deserialized object data 
      if (jsonObject != nil && error == nil){ 
       NSLog(@"Successfully deserialized..."); 
       if ([jsonObject isKindOfClass:[NSDictionary class]]){ 
        resultBlock = (NSDictionary *)jsonObject; 
        //NSLog(@"Deserialized JSON Dictionary = %@", resultBlock); 
       } 
       else if ([jsonObject isKindOfClass:[NSArray class]]){ 
        NSArray *deserializedArray = (NSArray *)jsonObject; 
        NSLog(@"Deserialized JSON Array = %@", deserializedArray); 
       } else { 
        /* Some other object was returned. We don't know how to deal 
        with this situation, as the deserializer returns only dictionaries 
        or arrays */ 
       } 
      } 
      else if (error != nil){ 
       NSLog(@"An error happened while deserializing the JSON data. %@", error); 
      }else{ 
       NSLog(@"No data could get downloaded from the URL."); 
       //[self conn:method]; 
      } 
     } 
    }); 
    dispatch_sync(dispatch_get_main_queue(), ^{ 

     /* Check if the resultBlock is not nil*/ 
     if(resultBlock != nil){ 
      /*Set the value of result. This will notify the observer*/ 
      [self setResult:resultBlock]; 
     } 
    }); 
}); 
} 

爲什麼會出現以下錯誤?反序列化JSON數據時發生錯誤

An error happened while deserializing the JSON data. Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x20839f80 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

當我將其更改爲

/* Now try to deserialize the JSON object into a dictionary */ 
       jsonObject = [NSJSONSerialization 
           JSONObjectWithData:jsonData 
           options:NSJSONReadingAllowFragments 
           error: &error]; 
      } 

我收到以下錯誤:

An error happened while deserializing the JSON data. Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x20888760 {NSDebugDescription=Invalid value around character 0.}

我改變了我的連接,從LTE到WiFi,現在我得到 504錯誤和的NSLog( @「沒有數據可以從URL下載。」);

+2

請分享JSON。 – stosha

+0

好吧,看來你的JSON是無效的,你可以使用在線工具來驗證它,例如[** this one **](http://jsonlint.com/) – Alladinian

+0

我驗證了json,它很好 – wwjdm

回答

1

你應該先修復代碼中的這些問題:

  1. 正確,在其中一個NSError對象作爲最後一個參數提供一個指向一個參考方法,例如檢查錯誤:- (BOOL) doSomething:(NSError**)error,或-(NSData*) doSomething:(NSError**)error

    爲了正確測試錯誤,您必須檢查方法返回值只有。這些方法表示具有「特殊返回值」的錯誤條件。例如,它們返回NOnil - 因爲總是在文檔中指定。只有在該方法指示錯誤後,提供的錯誤參數纔會包含一個有意義的值 - 即指向由該方法創建的NSError對象。請注意,當方法成功時,此參數也可能變爲非NULL,在這種情況下,該參數沒有「含義」。

  2. Web服務通常可以提供多種格式的請求資源。如果你沒有指定你想讓服務器對資源進行編碼的格式,你會得到一個默認格式 - 這是而不是必然是JSON。

    爲了明確所需的資源格式,請設置相應的「Accept」標頭。例如,如果您希望使用JSON格式,您可以在請求中設置一個標頭:"Accept: application/json"

  3. Web服務可能有理由不迴應您請求的資源。爲了確保您獲得了您請求的響應,您需要檢查狀態碼和MIME類型的響應,以確保您實際上收到了JSON響應。

  4. 看起來,你有點不確定如何使用調度功能的優勢。如果使用同步方便的方法sendSynchronousRequest:...您當然只需要將其包裝在一個dispatch_async函數中。如果您希望在主線程中設置結果,那麼您當然希望使用dispatch_async,而不是dispatch_sync。

    但是,如果您改爲使用sendAsynchronousRequest:...,這將是一項改進。只有當你在異步模式下使用NSURLConnection和落實NSURLConnection委託方法 - 我強烈推薦 - 實際上會成爲偉大的;)

所以,我認爲,一旦你定你的代碼,你可能會能夠自己回答原始問題,或從服務器獲得更好的錯誤響應,或者錯誤奇蹟般地消失;)

+0

今天早上我嘗試了代碼,所有工作。代理或網關沒有迅速響應,但現在它及時響應。 – wwjdm

+0

太棒了! :)儘管如此,你應該解決這些問題。他們遲早會咬你;) – CouchDeveloper