【发布时间】:2017-03-17 17:41:12
【问题描述】:
我即将完成我的第一个 iOS 应用,但我遇到了一个我不知道如何解决的问题。
应用程序的初始 ViewController 包含一个 MKMapView,它几乎没有注释。单击任何注解时,会出现一个弹出窗口,其中包含一些信息,然后,有一个信息按钮可通向一个新的 ViewController,其中包含与所选注解相关的详细信息。
问题是第二个 ViewController(DetailedViewController),有几个标签(标题、描述)、一个图像和几个链接,应该在 ViewController 本身显示之前加载。我正在从 JSON 中读取这些值,但没有问题。
我正在读取所有值并在 ViewDidLoad() 中设置它们
所以问题是,当第二个 ViewController(DetailedViewController) 加载到模拟器或物理 iPhone 中时,所有字段都有其默认值(故事板中设置的那个)并花费几秒钟来更新所需的值,即使从 JSON 中读取它们的速度如此之快(根据日志)。
另外,控制台中出现错误:
This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
Stack:(
0 CoreFoundation 0x000000018a0ca1d8 <redacted> + 148
1 libobjc.A.dylib 0x0000000188b0455c objc_exception_throw + 56
2 CoreFoundation 0x000000018a0ca108 <redacted> + 0
3 Foundation 0x000000018acb1ea4 <redacted> + 192
4 Foundation 0x000000018acb1be4 <redacted> + 76
5 Foundation 0x000000018aafd54c <redacted> + 112
6 Foundation 0x000000018acb0880 <redacted> + 112
7 UIKit 0x000000018ff2140c <redacted> + 1688
8 QuartzCore 0x000000018d3e1188 <redacted> + 148
9 UIKit 0x000000019056de90 <redacted> + 64
10 QuartzCore 0x000000018d3d5e64 <redacted> + 292
11 QuartzCore 0x000000018d3d5d24 <redacted> + 32
12 QuartzCore 0x000000018d3527ec <redacted> + 252
13 QuartzCore 0x000000018d379c58 <redacted> + 512
14 QuartzCore 0x000000018d37a124 <redacted> + 660
15 libsystem_pthread.dylib 0x000000018915efbc <redacted> + 572
16 libsystem_pthread.dylib 0x000000018915ece4 <redacted> + 200
17 libsystem_pthread.dylib 0x000000018915e378 pthread_mutex_lock + 0
18 libsystem_pthread.dylib 0x000000018915dda4 start_wqthread + 4
)
我读过类似的问题,他们在谈论这样的事情:
dispatch_async(dispatch_get_main_queue(){
// code here
})
但是我不知道具体怎么用 :(
谁能帮帮我?
提前非常感谢你:)
编辑:
我将添加我的详细视图控制器的代码,以更准确地解释发生了什么:
class BarDetailsViewController: UIViewController {
@IBOutlet var BarDetailsView: UIView!
@IBOutlet weak var BarNameLabel: UILabel!
@IBOutlet weak var BarDescriptionLabel: UILabel!
@IBOutlet weak var BarImage: UIImageView!
var barPhoneNumber: AnyObject! = "anyBarPhoneNumber"
var barWebsite: AnyObject! = "anyBarWebsite"
var barName: AnyObject! = "anyBarName"
var pinCoordinates : CLLocationCoordinate2D!
var pinId : String!
override func viewDidLoad() {
super.viewDidLoad()
let jsonURL: String = "http://www.craftbr.me/services/getbiz/index.php?barid=" + self.pinId
let requestURL: NSURL = NSURL(string: jsonURL)!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
(data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
do{
let json: AnyObject! = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
let barName: AnyObject! = json["name"]
self.BarNameLabel.text = String(barName)
self.barName = String(barName)
self.BarDescriptionLabel.text = (json["description"] as! String)
self.barPhoneNumber = json["telf"]
self.barWebsite = json["website"] as! String
let barImgUrl: AnyObject! = json["imgurl"]
let barImgUrlString: String! = String(barImgUrl)
if let imageUrl = NSURL(string: barImgUrlString),
let data = NSData(contentsOfURL: imageUrl)
{
self.BarImage.image = UIImage(data: data)
}
}catch {
print("Error with Json: \(error)")
}
}
}
task.resume()
}
}
因此,在这里,在 ViewDidLoad() 内部,我使用从 json 获得的信息来修改 Storyboard 中创建的标签内容。
问题是从 json 中获取信息是如此之快,但是,修改标签是一件很慢并引发错误的事情。
那么@fragilecat,我应该在哪里添加该功能?以及如何声明 DispatchQueue?我已经尝试过了,但它不起作用。而这个函数,应该在哪里调用呢?
再次感谢您的帮助:)
【问题讨论】:
标签: ios swift layout autolayout viewcontroller