【问题标题】:peformSelector with two arguments [duplicate]带有两个参数的 peformSelector [重复]
【发布时间】:2013-05-28 14:05:43
【问题描述】:

我必须在后台或新线程中运行此方法。如何在 performSelector 中传递两个参数?

[self addMessageFromRemoteNotification:userInfo updateUI:NO];

-(void)addMessageFromRemoteNotification:(NSDictionary *)userInfo updateUI:(BOOL)updateUI
{
}

【问题讨论】:

标签: ios objective-c nsthread


【解决方案1】:

如果你必须使用 performSelector 并且你想要 N 个参数,只需将它们包装在一个数组或字典中,并使被调用方法的签名具有单个参数 NSArray 或 NSDictionary。任何原始类型(如 int、float 等)都需要包装在 NSNumber 中。

NSArray 示例:

- (void) addMessageFromRemoteNotification:(NSArray*)parameters
{
}

...

[self performSelector:@selector(addMessageFromRemoteNotification:)
withObject:@[ obj1, obj2, obj3, @(4.0f)]];

NSDictionary 示例:

- (void) addMessageFromRemoteNotification:(NSDictionary*)parameters
{
}

...

[self performSelector:@selector(addMessageFromRemoteNotification:)
withObject:@{ @"prop1": @"prop1value", @"prop2": @(4.0f) }];

祝你好运!

【讨论】:

  • 我会选择 NSDictionary 而不是 NSArray,但这回答了问题:)
  • 更新以显示 NSDictionary 示例
【解决方案2】:

有方法

[self performSelector:@selector(addMessageFromRemoteNotification:) withObject:param1 withObject:param2];

你可以用这个。

【讨论】:

  • 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[AppDelegate addMessageFromRemoteNotification:]:无法识别的选择器发送到实例 0x21c7b0'
  • 我遇到了这个异常...
  • 我很确定-performSelector:withObject:withObject: 是编造的。
  • @GradyPlayer 不,这是一个真正的方法,但它不会将消息发送到后台线程。检查标题。
  • @dineshsurya 阅读错误消息。您的 AppDelegate 没有实现该方法。与performSelector:... 调用无关;并不是说这个特定的电话无论如何都能解决您的问题。
【解决方案3】:

只需为要发送的数据创建一个模型类,例如 -

@interface Car : NSObject

@property (nonatomic, strong) NSString *manufacturer;
@property (nonatomic, strong) NSString *colour;
@property (nonatomic, strong) NSDate *year;

@end

然后在你的 performSelector: 方法中传递它的一个实例。

这通常比传递多个参数要好,以防您决定更改数据模型(例如,添加更多属性)——当然这取决于具体情况。

【讨论】:

  • 这并没有错,只是有点粗心大意;只需使用字典......这就是框架在任何地方所做的:NSDictionary * userInfo
  • 也可能是编程风格的问题,或者参数是否适合它(例如,如果您经常在代码中使用多个参数,专用模型是否会使事情更清晰)
猜你喜欢
  • 1970-01-01
  • 2014-08-23
  • 2013-03-02
  • 2015-12-13
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多