2016-03-03 60 views
0

我对iOS开发新的REST API,我下面这个教程:https://grokswift.com/simple-rest-with-swift/,我不知道为什么下面的代码总是返回“占位”,我不能看到错误控制台输出:错误使用消耗迅速在iOS

import Foundation 

class Resolver{ 
    func doSomething() -> String{ 
     var result = "the placeholder" 
     print("inside doSomething") 
     let postEndpoint: String = "http://jsonplaceholder.typicode.com/posts/1" 
     guard let url = NSURL(string: postEndpoint) else { 
      print("Error: cannot create URL") 
      return "error here" 
     } 

     let urlRequest = NSURLRequest(URL: url) 

     let config = NSURLSessionConfiguration.defaultSessionConfiguration() 

     let session = NSURLSession(configuration: config) 
     print("another thing") 

     let task = session.dataTaskWithRequest(urlRequest, completionHandler: { 
      (data, response, error) in 
      guard let responseData = data else { 
       print("Error: did not receive data") 
       return 
       //return "error here" 
      } 
      print("hereeeeeee ############") 
      guard error == nil else { 
       print("error calling GET on /posts/1") 
       print(error) 
       return 
       //return "error here" 
      } 
      // parse the result as JSON, since that's what the API provides 
      let post: NSDictionary 
      do { 
       post = try NSJSONSerialization.JSONObjectWithData(responseData, 
        options: []) as! NSDictionary 
      } catch { 
       print("error trying to convert data to JSON") 
       return 
       //return "error here" 
      } 
      // now we have the post, let's just print it to prove we can access it 
      print("The post is: " + post.description) 
      result = post.description 

      // the post object is a dictionary 
      // so we just access the title using the "title" key 
      // so check for a title and print it if we have one 
      if let postTitle = post["title"] as? String { 
       print("The title is: " + postTitle) 
      } 

     }) 
     task.resume() 

     return result 
    }  

} 

这是我的info.plist:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>CFBundleIdentifier</key> 
    <string></string> 
    <key>CFBundleExecutable</key> 
    <string></string> 
    <key>CFBundleInfoDictionaryVersion</key> 
    <string>6.0</string> 
    <key>LSApplicationCategoryType</key> 
    <string></string> 
    <key>CFBundleName</key> 
    <string></string> 
    <key>CFBundleDisplayName</key> 
    <string></string> 
    <key>CFBundleVersion</key> 
    <string></string> 
    <key>NSAppTransportSecurity</key> 
    <dict> 
     <key>NSAllowsArbitraryLoads</key> 
     <true/> 
     <key>NSExceptionDomains</key> 
     <dict> 
      <key>httpbin.org</key> 
      <dict> 
       <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
      </dict> 
      <key>jsonplaceholder.typicode.com </key> 
      <dict> 
       <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
      </dict> 
     </dict> 
    </dict> 
    <key>CFBundleShortVersionString</key> 
    <string></string> 
    <key>CFBundleGetInfoString</key> 
    <string></string> 
</dict> 
</plist> 

当我运行测试我看到这样的输出:

Test Suite 'RestTest' started at 2016-03-03 15:38:49.364 
Test Case '-[FoodTrackerTests.RestTest testResolver]' started. 
inside doSomething 
another thing 
// I want to see the result: the placeholder 
Test Case '-[FoodTrackerTests.RestTest testResolver]' passed (0.061 seconds). 
Test Suite 'RestTest' passed at 2016-03-03 15:38:49.425. 
    Executed 1 test, with 0 failures (0 unexpected) in 0.061 (0.062) seconds 
Test Suite 'Selected tests' passed at 2016-03-03 15:38:49.426. 
    Executed 1 test, with 0 failures (0 unexpected) in 0.061 (0.063) seconds 

为什么结果变量不包含post.description值?

+0

你有没有尝试添加'task'内断点?为什么永远不会被调用?你的错误也不会丢失。也许这是因为你正在运行测试并且在异步API调用之前完成测试? – brandonscript

+0

我试着在操场上运行你的代码,它不会产生输出,就像你发现的一样。但是当我在真机上运行它时,它马上就可以正常工作。 – emrys57

+0

@remus你是对的。测试总是在http调用完成之前完成。我不知道你是否必须发布答案,以便将其标记为已接受,或者如果我必须自己这样做。 – PedroHidalgo

回答

0

正如评论所说,它看起来像测试完成返回前的HTTP调用(因为HTTP请求是异步),因此试运行结束之前,你是不是看到了API调用的结果。

看一看XCAsyncTestCase和设置您的测试,以等待异步回调来代替。

0

doSomething()方法异步呼叫结束之前返回"the placeholder"值。这就是你看到它的原因。