-3

我有一个 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 保存到我的服务器感到困惑,以便成员在登录或使用不同的设备时可以检索它,不浪费数据库空间。

4

1 回答 1

3

首先,为什么你有两个这样的嵌套 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"];
    }
}
于 2013-07-10T04:29:30.923 回答