Swift 4,必须仅从主线程警告中使用

时间:2017-09-14 11:47:00

标签: appdelegate swift4 xcode9

当我在test "should get root" do get static_pages_home_url assert_response :success end 中使用Swift4给我

  

UIApplication.delegate必须仅在主线程中使用

     

....必须仅在主线程中使用

     

从后台线程组

调用的UI API

紫色警告。

我的代码;

Xcode 9

警告线是;

var appDelegate = UIApplication.shared.delegate as! AppDelegate
public var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let prefs:UserDefaults = UserDefaults.standard
var deviceUUID = UIDevice.current.identifierForVendor!.uuidString

这样的另一个警告;

  public var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

给予

  

UITextField.text必须仅在主线程中使用

再次出现相同的错误..

我该如何解决?有什么想法吗?

1 个答案:

答案 0 :(得分:52)

您正在后台队列中进行此调用。要修复,请尝试类似......

public var context: NSManagedObjectContext

DispatchQueue.main.async {

    var appDelegate = UIApplication.shared.delegate as! AppDelegate
    context = appDelegate.persistentContainer.viewContext        
}

虽然这是一个非常糟糕的方法...你正在使用你的App Delegate作为全局变量(我们都知道这很糟糕!)

您应该查看将托管对象上下文从视图控制器传递到视图控制器...

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: 

    (window?.rootViewController as? MyViewController)?.moc = persistentContainer.viewContext
}

等等