好的,简短的故事是,如果不向 AJNMessageArgument 类添加自定义代码,就无法做到这一点。这是因为在这种情况下,“value”方法将返回一个指向 MsgArg 类型数组的指针。Objective C 不能与 MsgArg 交互——这就是他们为 Objective C 创建 AJNMessageArgument 包装器的全部原因。
这是如何完成的:
将此静态方法添加到您的 AJNMessageArgument.mm 类:
+ (NSArray*)getAJNMessageArgumentArrayFromMsgArgArray:(void*)arg : (int)size
{
NSMutableArray * toReturn = [NSMutableArray new];
MsgArg *msgArray = (MsgArg*) arg;
for (int i = 0; i < size; ++i)
{
void * msarg = malloc(sizeof(MsgArg));
MsgArg arg = msgArray[i];
memcpy(msarg, &msgArray[i], sizeof(MsgArg));
AJNMessageArgument *toAdd = [[AJNMessageArgument alloc] initWithHandle:msarg];
[toReturn addObject:toAdd];
}
return [toReturn copy];
}
不要忘记将方法定义添加到 AJNMessageArgument.h 文件中:
+ (NSMutableArray*)getAJNMessageArgumentArrayFromMsgArgArray:(void*)arg : (int)size
所以现在,在我们的目标 C 代码中,我们可以解析带有签名“as”的 AJNMessageArgument - 但我们还不能将其转换为 MsgArg 类型,因为我们无法在 objc++ 之外访问该结构 - 所以我们将使用 (空白 *)。
+ (NSArray*)getSupportedLangsFromMessageArgument:(AJNMessageArgument*)supportedLangsArg
{
void *strings; //void * to keep track of MsgArg array data.
size_t numVals;
QStatus status = [supportedLangsArg value: @"as", &numVals, &strings];
if(status != ER_OK){
NSLog(@"ERROR: Could not supported languages from the message argument");
}
NSMutableArray *arrayOfMsgArgs = [AJNMessageArgument getAJNMessageArgumentArrayFromMsgArgArray:strings :numVals];
//Now loop through the resulting AJNMessageArguments of type ALLJOYN_STRING - and parse out the string.
NSMutableArray *arrayOfStrings = [NSMutableArray new];
for (AJNMessageArgument *arg in arrayOfMsgArgs) {
NSString* msgArgValue = [AboutUtil getStringFromMessageArgument:arg];
[arrayOfStrings addObject:msgArgValue];
}
return [arrayOfStrings copy];
}
现在我们有了一个由 NSString 组成的 NSArray。唷。
如果您想查看从数组中的 AJNMessageArguments 中获取 NSString 的代码,请使用以下方法:
+ (NSString*)getStringFromMessageArgument:(AJNMessageArgument*)msgarg
{
char *charStr;
QStatus status = [msgarg value:@"s", &charStr];
if (status != ER_OK) {
NSLog(@"Error");
}
NSString *str = [NSString stringWithFormat:@"%s", charStr];
return str;
}
快乐 AllJoyn-ing。