2016-03-08 25 views
0

在我的swift 2应用程序中,我想发出一个http-post-request来获取我的mysql数据库的数据。之后,我想将这些数据写入我的核心数据。预览任务完成后,swift做任务

我有用于请求和写入的代码部分。

如何获得以下结构。

  1. 请求数据
  2. 如果请求数据完全写入到核心数据

难道这是正确的事情吗?

这是我的Sync.swift文件中的SyncMYSQL函数。

class func SyncMYSQL() { 

     print("START SYNC MYSQL") 

     UIApplication.sharedApplication().networkActivityIndicatorVisible = true 
     let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 
     let defaults = NSUserDefaults.standardUserDefaults() 



      let request = NSMutableURLRequest(URL: NSURL(string: "https://xxx")!) 
      request.HTTPMethod = "POST" 
      let postString = "userid=12" 


      request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
      let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
       data, response, error in 

       // if no internet connection 
       guard error == nil && data != nil else { 
        print("error=\(error)") 
        return 
       } 

       let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)! 


       let fetchRequest = NSFetchRequest(entityName: "ITEMS") 
       fetchRequest.returnsObjectsAsFaults = false 

       do { 
        let results = try managedObjectContext!.executeFetchRequest(fetchRequest) 
        for managedObject in results { 
         let managedObjectData:NSManagedObject = managedObject as! NSManagedObject 
         managedObjectContext!.deleteObject(managedObjectData) 
        } 
       } catch let error as NSError { 
        print("Detele all data in ITEMS error : \(error) \(error.userInfo)") 
       } 



       var x = 0 
       while (x < responseString.count) { 


        let newItem = NSEntityDescription.insertNewObjectForEntityForName("ITEMS", inManagedObjectContext: managedObjectContext!) as! CoreData_ITEMS 
        newItem.name = responseString[x] 
        x++ 
       } 

       dispatch_sync(dispatch_get_main_queue(),{ 
        print("FINISH MYSQL") 
        UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
       }); 

      } 
      task.resume() 
     } 

这个功能,我从我的视图控制器打电话像这样:

func RequestData() { 

     Sync.SyncMYSQL() 
print ("Start Core Data") 

     let fetchRequest = NSFetchRequest(entityName: "ITEMS") 
     do { 
      try data = managedObjectContext!.executeFetchRequest(fetchRequest) as! [CoreData_ITEMS] 
     } catch { } 



     Table.reloadData() 
    } 
+0

您发布的代码是处理异步操作。所以应该在后面运行的代码。 –

+0

但在后面运行这样的任务确实是个好主意。 –

+0

如果你说,你已经有写和请求的代码,那么是的。你应该把它放到你刚刚发布的异步代码中。但这样我没有得到你的线程 –

回答

2

你应该使用封闭模块回调当操作结束

class func SyncMYSQL(onSuccess:()->()){ 

    // your custom events 
    // your custom events 
    // your custom events 

    if MYSQLisSynced == true { 
     // when MYSQL is synced you can call the success block 
     onSuccess() 
    } 

} 

在当你调用其他文件函数SyncMYSQL()你必须指定on成功块

SyncMYSQL {() ->() in 
    //custom callback actions 
} 
+0

是的,它是!谢谢。最后一点问题。你能解释我的代码是如何工作的吗?我想了解它:) – Stack108