【问题标题】:NSString Array to NSArrayNSString 数组到 NSArray
【发布时间】:2013-07-10 04:23:36
【问题描述】:

我有一个 NSMutableArray 保存到我的服务器,当我通过此代码返回它时:

[AsyncURLConnection request:url completeBlock:^(NSData *data) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        dispatch_async(dispatch_get_main_queue(), ^{
            NSString *myString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            if (![myString isEqualToString:@"0"]) {
            [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myString] forKey:@"savedArray"];
            NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedArray"]];
            contactsArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
                [table reloadData];
            }else{
                contactsArray = [[NSMutableArray alloc] init];
            }

        });
    });
} errorBlock:^(NSError *errorss) {

}];

oldSavedArray 数组返回:

 (
    (
    "Andrew Dunn",
    "andrew@dunn-carabali.com",
    accept
),
    (
    "John Appleseed",
    "John-Appleseed@mac.com",
    alert
)
)

但是

 contactsArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];

总是用

轰炸
-[__NSCFString count]: unrecognized selector sent to instance

我已经尝试了我能想到的所有可能的方法来解决这个问题,所以我对下一步做什么或如何将 NSMutableArray 保存到我的服务器感到困惑,以便成员在登录或使用时可以检索它不同的设备,不会浪费数据库空间。

【问题讨论】:

    标签: ios objective-c nsstring nsmutablearray nsarray


    【解决方案1】:

    首先,为什么你有两个这样的嵌套 dispatch_async 调用?这似乎一事无成。跳过外层,直接使用内层 dispatch_async。

    第二,在这一行……​​

    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myString] forKey:@"savedArray"];
    

    您正在用户默认值中存储一个字符串 (myString)。然后在它下面的那一行...

    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedArray"]];
    

    您正在从用户默认值中提取完全相同的字符串并将其分配给数组。所以“oldSavedArray”不是一个 NSArray,它是一个 NString。而且 NSString 没有“计数”选择器。

    更新:

    我并不完全清楚你想要完成什么,但我猜你想从你的服务器(应该包含一个数组)解码一些 JSON 数据并将其存储在用户默认值中。如果是这种情况,下面是一个如何做到这一点的示例:

    if (![myString isEqualToString:@"0"]) {
        NSError * error = nil;
        NSArray * arrayFromJSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
        if (!arrayFromJSON) {
            NSLog(@"couldn't decode JSON, error: %@ (userInfo: %@)", [error localizedDescription], [error userInfo]);
        }
        else {
            NSParameterAssert([arrayFromJSON isKindOfClass:[NSArray class]]); // consider improving your code to handle unexpected data.  If your server were to start returning something besides an array your code is going to break
            [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:arrayFromJSON] forKey:@"savedArray"];
        }
    }
    

    【讨论】:

    • 有没有办法更好地做到这一点。
    • 请看我的更新——如果它没有帮助,你可能需要解释你的意图是什么。
    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多