在iphone中的performSelectorOnMainThread中出现问题

时间:2011-02-28 13:33:35

标签: iphone

我这样做了


[(OfficeLinQViewController*)sharedManager.m_o  performSelectorOnMainThread:@selector(findLocalListing::)
                                                               withObject:(folderList,path) 
                                                            waitUntilDone:NO];
但问题是在findLocalListing函数中,两个参数路径都保存了不是folderList。

4 个答案:

答案 0 :(得分:5)

再看一下withObject:部分。它表示withObject,而不是withObjects。您只能将一个参数传递给选择器。

我通常使用这样的包装器方法来解决这些问题。

[(OfficeLinQViewController*)sharedManager.m_o performSelectorOnMainThread:@selector(findLocalListingWithArgumentArray:)withObject:[NSArray arrayWithObjects:folderList,path, nil] waitUntilDone:NO];

- (void)findLocalListingWithArgumentArray:(NSArray *)argArray {
    [self findLocalListing:[argArray objectAtIndex:0] inPath:[argArray objectAtIndex:1]];
}

哦,你应该将findLocalListing ::重命名为有用的东西。

答案 1 :(得分:1)

我同意其他所有答案 - 你只能传递一个对象。但是,我通常以不同的方式解决它。

我使用NSDictionary来保存你的对象

NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:
                      folderList, @"folderList", path, @"path", nil];
[(OfficeLinQViewController*)sharedManager.m_o performSelectorOnMainThread:@selector(findLocalListing:) withObject:info waitUntilDone:NO];

在findLocalListing中

- (void)findLocalListing:(NSDictionary *)info {
    NSString *path = [info objectForKey:@"path"];
    NSArray *folderList = [info objectForKey:@"folderList"];

这使您可以根据需要传递任意数量的对象:)


如果你不喜欢NSDictionary,你可以创建自己的对象并传递它:)

答案 2 :(得分:0)

我认为应该更像这样:

[(OfficeLinQViewController*)sharedManager .m_o performSelectorOnMainThread:@selector(findLocalListing:) withObject:(folderList) waitUntilDone:NO];

请注意,我从@selector参数中删除了第二个冒号以及withObject:参数中的第二个参数。 performSelectorOnMainThread不支持在没有先将它们包装在某种集合中的情况下发送多个对象。

但是,您可以按照提到的here向NSObject添加一个类别。它应该没问题,但我总是对基础对象添加方法持谨慎态度。

答案 3 :(得分:0)

您只能将一个对象传递给performSelector。我注意到您尝试使用以下格式传递两个:

(folderList,path)

这种元组形式在C中是允许的,但它不会像你想象的那样。我相信它会对元组中的每个项目进行评估,但总体而言,元组将评估最后一个项目的评估。

如果您需要向相关选择器提供一些内容,您可以选择以下几种方法:

  • 将它们包装在一个容器对象中(或者自己滚动,或者使用somesort的集合,这确实感觉有些松散)
  • 让选择器代码能够从某个地方获取值而不作为params传入(例如从某个地方作为属性访问)
顺便说一句,把事情说得好像。变量名中的_和_非常不标准。你关心多少取决于你,但如果其他人必须阅读你的代码(包括本网站上的人),你可能会考虑坚持正常的命名约定。