【问题标题】:Swift 4 ,must be used from main thread only warningSwift 4,必须从主线程中使用,只有警告
【发布时间】:2018-02-23 09:19:45
【问题描述】:

当我使用Swift4in Xcode 9 给我时

UIApplication.delegate 只能在主线程中使用

....只能在主线程中使用

从后台线程组调用的 UI API

紫色警告。

我的代码;

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

这样的另一个警告;

 let parameters = [
                        "tel": "\(self.phone.text!)"
                        ] as [String : String]

给予

UITextField.text 只能在主线程中使用

又是同样的错误..

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

【问题讨论】:

    标签: appdelegate swift4 xcode9


    【解决方案1】:

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

    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
    }
    

    等等

    【讨论】:

    • 给出属性“public”只能用于非本地范围错误
    • 您是否尝试删除public
    • 在应用程序中出现许多错误,我的 settings.swift 文件中的代码不是类,我需要在应用程序委托中移动代码?
    • 当我使用那个代码给我的时候;顶层不允许使用表达式
    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多