Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何解析NSArray,使其仅参与每个数组项?_Ios_Objective C_Arrays_Cocoa - Fatal编程技术网

Ios 如何解析NSArray,使其仅参与每个数组项?

Ios 如何解析NSArray,使其仅参与每个数组项?,ios,objective-c,arrays,cocoa,Ios,Objective C,Arrays,Cocoa,这是我的数组,它是来自后端的响应 NSArray *myArray = [NSArray arrayWithObjects:@" userId: 123, online: 0, subscriptionState: none",@" userId: 124, online: 0, subscriptionState: none",@" userId: 125, online: 1, subscriptionState: none",nil]; NSLog(@"this is an exa

这是我的数组,它是来自后端的响应

NSArray  *myArray = [NSArray arrayWithObjects:@"  userId: 123, online: 0, subscriptionState: none",@"  userId: 124, online: 0, subscriptionState: none",@"  userId: 125, online: 1, subscriptionState: none",nil];
NSLog(@"this is an example array=%@", myArray);]
日志:

我只想从这个数组中提取用户ID号,以创建一个新的数组,该数组将具有如下日志输出

this is the new array=(
        "123",
        "124",
        "125"
    )

尝试创建一个新的
类User:NSObject
,并使用一个用户数组,而不是试图解析这些内容。如果要跟踪每个用户的项目,那么确实需要一个用户类来包含它。这将允许您使用用户对象,而不是解析出的字符串。这为您提供了更多的功能、灵活性和更简洁的代码

用户.h

@interface User : NSObject

@property (nonatomic) int userId;
@property (nonatomic) BOOL isOnline;
@property (nonatomic) int subscriptionState;
然后在你们班上:

User *user1 = [User new];
user1.userId = 123;
user1.isOnline = NO;
user1.subscriptionState = 0;
...

NSArray *usersArray = [NSArray arrayWithObjects:user1,user2,user3,nil];
for (User *curUser in usersArray)
{
   NSLog(@"User ID: %d", curUser.userId);
}
现在你可以打印出他们是否在线,他们的订阅状态是什么,还可以很容易地更新用户。以前,如果用户更改了订阅状态或联机,您必须手动更新整个
NSString
。例如,如果User1联机,则必须将其重置为:
@“userId:123,online:1,subscriptionState:none”
。这是非常混乱和大量的工作。现在,您只需执行以下操作:

 user1 = [usersArray objectAtIndex:0];
 user1.isOnline = YES;
更新:

我注意到这是从后端返回的。请注意,如果无法修复后端,这是如何使其与后端返回一起工作的。除非你被迫这样做,否则使用这种方法是非常不明智的

NSArray *wordArray = [userString componentsSeparatedByString:@","];
NSString *userId = [[[wordArray objectAtIndex:0] componentsSeparatedByString:@":"] objectAtIndex:1];
NSString *online = [[[wordArray objectAtIndex:1] componentsSeparatedByString:@":"] objectAtIndex:1];
NSString *subscriptionStatus = [[[wordArray objectAtIndex:2] componentsSeparatedByString:@":"] objectAtIndex:1];

如果你必须依赖文本提取来进行这样的操作,你可能需要考虑重构代码。* MyRoad是我为我的应用程序所使用的后端服务的一种响应。这就是我所假设的。我的意思是你应该重新分解你的后端,在你的通信中使用更结构化的东西,比如JSON。简单地输出字符串,然后依靠偏移量或正则表达式来捕获数据是非常不可靠的。这看起来像一个近乎json的响应。如果是这种情况,请查看NSJSONSerialization,否则我将感谢您的详细回复,谢谢。问题是我要从正在使用的后端服务中获取第一个数组,这就是数据的格式化方式。我已经为用户创建了类,但是为了让这些特定的用户成为一个数组,我需要首先解析响应中的所有userid。这是问题的一个很长的版本哦,明白了。没有意识到这是从服务器返回的(请确保在问题中指定,否则我们假定您是编程新手):)。看起来这是Quickblox的返回-没有办法获取JSON吗?如果是这样的话,那么你需要将你的数组拆分两次,我马上更新这个问题我相信你是正确的LyricalPanda,我只是不知道如何使用JSON,因为我是新手,没有使用JSON的经验。我不太理解使用它的文档。我正在使用Quickblox,但我没有看到任何关于我尝试做什么的具体内容。下面是quickblox使用的其他类的一些json,如果这可能是一个线索的话,哇,你真是个天才!谢谢你,伙计。希望现在就可以了,但我肯定需要学习更多关于使用JSON的知识,谢谢大家的支持!我刚看了他们的文档,他们实际上返回了JSON格式。我不知道为什么您的代码返回一个已解析的NSString。稍后我会看看你的另一个问题,看看我是否能找出原因
NSArray *wordArray = [userString componentsSeparatedByString:@","];
NSString *userId = [[[wordArray objectAtIndex:0] componentsSeparatedByString:@":"] objectAtIndex:1];
NSString *online = [[[wordArray objectAtIndex:1] componentsSeparatedByString:@":"] objectAtIndex:1];
NSString *subscriptionStatus = [[[wordArray objectAtIndex:2] componentsSeparatedByString:@":"] objectAtIndex:1];