Как я могу вернуть NSJsonSerialization

Во-первых, я ничего не знаю об Objective-C.

При этом следующий код должен получать данные из AsyncStorage.

Я уже сделал что-то подобное для Android, где основная идея - получить данные из AsyncStorage как Json Object.

Теперь мне нужно использовать jsonFromLocalRNStrogeForKey внутри callInviteReceived

jsonFromLocalRNStrogeForKey источник

+(void)jsonFromLocalRNStrogeForKey:(NSString *)key completion:(void (^)(NSDictionary * _Nullable, NSError * _Nullable))completion
{
    RCTResponseSenderBlock rnCompletion = ^(NSArray *response) {

        NSString *jsonAsString;

        if (response.count > 1) {
            NSArray *response1 = response[1];
            if (response1.count > 0) {
                NSArray *response2 = response1[0];                
                if (response2.count > 1) {
                    jsonAsString = response2[1];
                }
            }
        }

        NSData *jsonAsData = [jsonAsString dataUsingEncoding:NSUTF8StringEncoding];

        NSError *error;

        NSDictionary *json = [
            NSJSONSerialization
            JSONObjectWithData:jsonAsData
            options:NSJSONReadingMutableContainers
            error:&error
        ];

        completion(json, error);
    };

    RCTAsyncLocalStorage *storage = [RCTAsyncLocalStorage new];   

    dispatch_async(storage.methodQueue, ^{
        [storage performSelector:@selector(multiGet:callback:) withObject:@[key] withObject:rnCompletion];
    });
}

callInviteReceived

- (void)callInviteReceived:(TVOCallInvite *)callInvite {    
    NSJsonSerialization json = [self.jsonFromLocalRNStrogeForKey];
    // json.user.name
    [self reportIncomingCallFrom:@json.user.name withUUID:callInvite.uuid];
}

Эти методы должны работать примерно так

-(NSJsonSerialization)jsonFromLocalRNStrogeForKey: {
    ...
    return json;
}

- (void)callInviteReceived {    
    ...

    NSJsonSerialization json = [self.jsonFromLocalRNStrogeForKey];

    // json.user.name
    [self reportIncomingCallFrom:json.user.name withUUID:callInvite.uuid];
}

Итак, есть ли кто-нибудь, кто мог бы показать мне, как это кодировать?


Использование RCTAsyncLocalStorage + getAllKeys


person Pablo    schedule 12.01.2018    source источник


Ответы (1)


Код будет выглядеть примерно так (вам нужно будет указать параметр storageKey):

- (void)callInviteReceived:(TVOCallInvite *)callInvite {    
    [self jsonFromLocalRNStrogeForKey:/*storageKey*/ completion:^(NSDictionary* data,NSError* error){
        if(data){
            NSString * name = [data valueForKeyPath@"user.name"];
            if(![name isKindOfClass:[NSNull class]]){
                [self reportIncomingCallFrom:name withUUID:callInvite.uuid];
            }
        }else{
            //handle error
            NSLog(@"JSON Parsing Error: %@",error.localizedDescription)
        }
   }
}

NSJSONSerialization - служебный класс, отвечающий за сериализацию и десериализацию JSON. Все его методы являются методами класса, поэтому передавать его как возвращаемое значение бессмысленно.

Результатом десериализации является NSDictionary, который является представлением JSON на карте. Вы можете использовать эту карту для извлечения значений user.name.

person W.K.S    schedule 12.01.2018
comment
Это сработало! Большое спасибо! Кстати, знаете ли вы, есть ли конкретный storageKey как root? Потому что с каждой попытки я получаю ноль. Я тоже пробовал getAllKeys, но меня нет. - person Pablo; 15.01.2018
comment
Обновите свой вопрос, включив в него код, который вы использовали для getAllKeys. getAllKeys - это метод с RCTResponseSenderBlock . Используйте NSLog для печати содержимого массива, возвращаемого в RCTResponseSenderBlock. github.com/gpbl/react-native-blur-example/blob/master/ - person W.K.S; 15.01.2018
comment
Конечно, только что сделал! Еще раз спасибо. - person Pablo; 16.01.2018
comment
Вы звоните getAllKeys неправильно. Пожалуйста, опубликуйте это как отдельный вопрос, чтобы избежать путаницы. Вы можете вставить ссылку на этот вопрос здесь, и я отвечу на него. Как только getAllKeys заработает, у вас будет список ключей, и вы сможете использовать соответствующий ключ в jsonFromLocalRNStrogeForKey:completion - person W.K.S; 16.01.2018
comment
Вот stackoverflow.com/questions/48280006/ - person Pablo; 16.01.2018