IOS/Objective-C: 返回主线程
IOS/Objective-C: returning to main thread
我想我明白以下是如何工作的,但希望得到确认。
dispatch_async(kBgQueue, ^{
NSData* data = [NSData dataWithContentsOfURL: dataUrl];
[self fetchData:data];//go to web, get data and store in core data
}
dispatch_async(dispatch_get_main_queue(), ^{
//display new data on main thread.
}
我的问题是,我能不能理所当然地认为,在后台发生的所有事情结束后,主线程上的显示才会发生——不管多长时间?
我希望得到确认的原因是我偶尔会观察到一些显示问题。当后台线程尚未完成保存时,要确保显示器不会尝试访问核心数据。
您的代码不正确。您正试图在从 URL.
检索数据之前很久就更新 UI
你需要:
dispatch_async(kBgQueue, ^{
NSData* data = [NSData dataWithContentsOfURL: dataUrl];
[self fetchData:data];//go to web, get data and store in core data
dispatch_async(dispatch_get_main_queue(), ^{
//display new data on main thread.
}
}
此代码还假设 fetchData:
不是异步的,这意味着它不会 return 直到数据被获取和更新。
我想我明白以下是如何工作的,但希望得到确认。
dispatch_async(kBgQueue, ^{
NSData* data = [NSData dataWithContentsOfURL: dataUrl];
[self fetchData:data];//go to web, get data and store in core data
}
dispatch_async(dispatch_get_main_queue(), ^{
//display new data on main thread.
}
我的问题是,我能不能理所当然地认为,在后台发生的所有事情结束后,主线程上的显示才会发生——不管多长时间?
我希望得到确认的原因是我偶尔会观察到一些显示问题。当后台线程尚未完成保存时,要确保显示器不会尝试访问核心数据。
您的代码不正确。您正试图在从 URL.
检索数据之前很久就更新 UI你需要:
dispatch_async(kBgQueue, ^{
NSData* data = [NSData dataWithContentsOfURL: dataUrl];
[self fetchData:data];//go to web, get data and store in core data
dispatch_async(dispatch_get_main_queue(), ^{
//display new data on main thread.
}
}
此代码还假设 fetchData:
不是异步的,这意味着它不会 return 直到数据被获取和更新。