0

我有一个线程会调用我的许多接口函数。当它调用时我需要做一些 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);
                });
         }

现在名称指针大部分时间我在调度调用中得到 nil (我想我在这里丢失数据),我尝试使用 performselectoronMainthread 方法..但我不知道如何将它与多个参数一起使用..

任何想法谢谢..

4

2 回答 2

1

我将其发布为答案,因为很难将其放入评论中,但是如果您使用performSelectorOnMainThread:withObject:waitUntilDone:,您可以将您的两位信息包装到字典(或数组,但字典效果更好,因为您可以访问信息按名字):

NSDictionary *info = @{ @"name" : @(name), @"user_id", @(user_id) };
[self performSelectorOnMainThread:@selector(someMethod:) withObject:info waitUntilDone:NO];

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

- (void) someMethod:(NSDictionary *) info
{
    NSString *name = info[@"name"];
    NSNumber *user_id = info[@"user_id"];

    // unbox name and user_id if necessary
}
于 2013-01-16T11:12:43.487 回答
1

您的问题可能是interface_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*or传入NSData*。在这种情况下,内容将被保留,直到您的块完成。

于 2013-01-16T11:14:37.750 回答