iOS - 何时在主线程中调用UI更改功能

时间:2015-09-01 02:33:46

标签: ios objective-c multithreading dispatch-async

每次我对我的服务器进行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函数,所以任何帮助或建议将不胜感激。感谢。

2 个答案:

答案 0 :(得分:1)

简短回答:是的,您应该在主线程上更新您的UI。

  

主题和您的用户界面

     

如果您的应用程序具有图形用户界面,建议您使用   您收到与用户相关的事件并启动界面更新   从您的应用程序的主线程。这种方法有助于避免   与处理用户事件相关的同步问题   绘图窗口内容。一些框架,例如Cocoa   需要这种行为,但即使对于那些不这样做,也要保持这种行为   主线程上的行为具有简化逻辑的优点   用于管理用户界面。

     

有一些值得注意的例外,它们有利于执行   来自其他线程的图形操作。例如,您可以使用   辅助线程来创建和处理图像并执行其他操作   与图像有关的计算。为这些使用辅助线程   操作可以大大提高性能。如果你不确定   但是,一个特定的图形操作,计划从你的   主线。

参考:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/AboutThreads/AboutThreads.html

答案 1 :(得分:0)

首先,你不应该在一个街区内使用self。您可以使用 __弱yourClassName * weakSelf = self

关于您的问题,所有UI更改都应该在主线程上完成。所以你需要这样做:

[apiObject getDataFromObject:my.Object successCallback:^(Array *data) 
{
    dispatch_async(dispatch_get_main_queue(), ^{
        [weakSelf doALotOfUIChanging];
    });
} 

希望它有所帮助。 :)