每次我对我的服务器进行API调用以获取数据时,我已经知道我必须使用以下块来执行UI更改命令,因为我的API调用在后台线程中执行:
dispatch_async(dispatch_get_main_queue(), ^{
//do UI stuff
});
但是,如果我有一个功能可以在API调用块之外更改UI的内容呢?例如:
-(void)doALotOfUIChanging
{
//do a lot of UI changing
}
在我的API调用块中,我是否需要在主线程中调用该UI更改函数,如此?:
[apiObject getDataFromObject:my.Object successCallback:^(Array *data)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self doALotOfUIChanging];
});
}
errorCallback:^(NSString *error)
{
NSLog(@"%@", error);
}];
或者我不必在主线程中调用它,因为该函数已经在API调用块之外了吗?:
[apiObject getDataFromObject:my.Object successCallback:^(Array *data)
{
[self doALotOfUIChanging];
}
errorCallback:^(NSString *error)
{
NSLog(@"%@", error);
}];
我还有对其他视图控制器执行segue的函数,所以我也想知道是否应该在主线程中调用它们。我正在做一些代码清理,我不想在我可能不需要的情况下不断重写dispatch_async函数,所以任何帮助或建议将不胜感激。感谢。
答案 0 :(得分:1)
简短回答:是的,您应该在主线程上更新您的UI。
主题和您的用户界面
如果您的应用程序具有图形用户界面,建议您使用 您收到与用户相关的事件并启动界面更新 从您的应用程序的主线程。这种方法有助于避免 与处理用户事件相关的同步问题 绘图窗口内容。一些框架,例如Cocoa 需要这种行为,但即使对于那些不这样做,也要保持这种行为 主线程上的行为具有简化逻辑的优点 用于管理用户界面。
有一些值得注意的例外,它们有利于执行 来自其他线程的图形操作。例如,您可以使用 辅助线程来创建和处理图像并执行其他操作 与图像有关的计算。为这些使用辅助线程 操作可以大大提高性能。如果你不确定 但是,一个特定的图形操作,计划从你的 主线。
参考:
答案 1 :(得分:0)
首先,你不应该在一个街区内使用self。您可以使用 __弱yourClassName * weakSelf = self 。
关于您的问题,所有UI更改都应该在主线程上完成。所以你需要这样做:
[apiObject getDataFromObject:my.Object successCallback:^(Array *data)
{
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf doALotOfUIChanging];
});
}
希望它有所帮助。 :)