Iphone 如何在thread-IOS中执行GUI操作

Iphone 如何在thread-IOS中执行GUI操作,iphone,ios,objective-c,cocoa-touch,dispatch-async,Iphone,Ios,Objective C,Cocoa Touch,Dispatch Async,我有一个线程,它将调用我的许多接口函数。。当它调用时,我需要做一些GUI操作,因为我知道GUI需要在主线程中完成,现在我仍然在使用 dispatch_async(dispatch_get_main_queue(), ^{ // Some method call... }); 它在大多数情况下都能正常工作,但我仍然面临着这个问题。。例如,我的界面功能如下 void interface_fun(char

我有一个线程,它将调用我的许多接口函数。。当它调用时,我需要做一些GUI操作,因为我知道GUI需要在主线程中完成,现在我仍然在使用

            dispatch_async(dispatch_get_main_queue(), ^{
                // Some method call...
            });
它在大多数情况下都能正常工作,但我仍然面临着这个问题。。例如,我的界面功能如下

        void interface_fun(char *name, int user_id) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    gui_acton_with_name(name, user_id);
                });
         }
现在名称指针大部分时间是在dispatch调用中得到nil(我想我在这里丢失了数据),我尝试使用performselectoronMainthread方法。。但我不知道如何使用多个参数


任何想法,谢谢。

我将此作为一个答案发布,因为很难将其放入注释中,但是如果您使用
performSelectorOnMainThread:withObject:waitUntilDone:
,您可以将两位信息包装到字典(或数组)中,但字典工作得更好,因为您可以按名称访问信息):

然后在您的方法中(仅限iOS 6,除非您恢复到oldschool
objectForKey:
):


您的问题可能是,
interface\u fun
返回后,
name
指向的对象已被释放

您应该将
name
复制到局部变量,然后在块的末尾释放该变量。(如果使用ARC,则为自动)。大概是这样的:

NSData *data = [NSData dataWithBytes:name length:strlen(name)+1];
dispatch_async(dispatch_get_main_queue(), ^{
  gui_acton_with_name((char*)[data bytes], user_id);
});

如果您使用的是ARC,还可以将
name
作为
NSString*
NSData*
传入。在这种情况下,内容将保留到您的区块完成。

@dramlax感谢您的回复。。通过这些更改,是否有可能丢失上述数据。如果您将
名称
框入带有
@(名称)
的NSString,并将其存储在字典中,则不会丢失数据,因为它会为您创建副本。
- (void) someMethod:(NSDictionary *) info
{
    NSString *name = info[@"name"];
    NSNumber *user_id = info[@"user_id"];

    // unbox name and user_id if necessary
}
NSData *data = [NSData dataWithBytes:name length:strlen(name)+1];
dispatch_async(dispatch_get_main_queue(), ^{
  gui_acton_with_name((char*)[data bytes], user_id);
});