8

对不起新手问题(也许)。我正在为 ios 开发一个应用程序,并且我正在尝试从主线程中执行一个外部 xml 读取,以免在调用发挥其魔力时冻结 ui。

这是我知道使进程不在目标 c 的主线程中执行的唯一方法

[self performSelectorInBackground:@selector(callXml)
                           withObject:self];

所以我确实将我的调用封装到一个函数中

 - (void)callXml{
     [RXMLElement elementFromURL:[NSURL URLWithString:indXML]];
 }

现在我必须使字符串 indXML 成为函数的参数,以便根据需要调用不同的 xml。就像是

 - (void)callXml:(NSString *) name{
     [RXMLElement elementFromURL:[NSURL URLWithString:indXML]];
 }

在这种情况下,对 performSelector 的调用如何改变?如果我以通常的方式执行此操作,则会出现语法错误:

[self performSelectorInBackground:@selector(callXml:@"test")
                           withObject:self];
4

5 回答 5

16
[self performSelectorInBackground:@selector(callXml:)
                       withObject:@"test"];

即:您作为 withObject: 传入的内容成为您的方法的参数。

就像这里的一个兴趣点是你如何使用 GCD 来做到这一点:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self callXml:@"test"];

    // If you then need to execute something making sure it's on the main thread (updating the UI for example)
    dispatch_async(dispatch_get_main_queue(), ^{
        [self updateGUI];
    });
});
于 2013-05-14T08:48:27.350 回答
8

为了这

- (void)callXml:(NSString *) name{
     [RXMLElement elementFromURL:[NSURL URLWithString:indXML]];
 } 

你可以这样打电话

  [self performSelectorInBackground:@selector(callXml:)
                               withObject:@"test"];

如果您的方法有参数,则:与 method_name 一起使用,并将参数作为withObject参数传递

于 2013-05-14T08:48:57.567 回答
1

您使用的选择器需要与方法名称完全匹配 - 方法名称包括冒号 (:) 字符。所以你的选择器应该是:

@selector(callXml:)

如果你想传递一个参数。

如果您需要传递更复杂的数据,您有 3 个选项:

  1. 传递一个NSArrayNSDictionary包含参数
  2. 传递一个包含所有必需数据作为属性的自定义对象
  3. 使用 GCD(GCD_libdispatch 参考
于 2013-05-14T08:52:10.890 回答
1

你好试试这个

 RXMLElement *rootXML= [self performSelectorInBackground:@selector(callXml:)
                               withObject:@"test"];

- (RXMLElement *)callXml:(NSString *) name{

         NSLog(@"%@",name);//Here passed value will be printed i.e test

     return [RXMLElement elementFromURL:[NSURL URLWithString:indXML]];
 } 
于 2013-05-14T08:56:04.960 回答
0

由于performSelectorInBackground:withObject:只接受一个对象参数。解决此限制的一种方法是将参数字典(或数组)传递给“包装器”方法,该方法解构参数并调用您的实际方法。

于 2013-05-14T08:49:40.950 回答