2015-04-27 4 views
0

Я установил значение моего NSString, называемого «fid», в responseObject (см. Ниже). responseObject возвращает данные, которые я хочу, когда NSLog'd, но по какой-то причине, когда я NSLog фид дальше, он пуст. Я что-то упускаю? Смотрите код:Значение NSString возвращает null, но не знаете почему?

.h

@property (nonatomic, assign) NSString *fid; 

.m

[DIOSFile fileSave:file success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"File uploaded!"); 

    [file setObject:[responseObject objectForKey:@"fid"] forKey:@"fid"]; 
    [file removeObjectForKey:@"file"]; 

fid = [responseObject objectForKey:@"fid"]; 
     NSLog(@"%@",responseObject); 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Failed to upload file!"); 
    }]; 

    NSDictionary *bodyValues = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:_itemDescrip.text, nil] forKeys:[NSArray arrayWithObjects:@"value", nil]]; 
    NSDictionary *languageDict = [NSDictionary dictionaryWithObject:[NSArray arrayWithObject:bodyValues] forKey:@"und"]; 
    [nodeData setObject:languageDict forKey:@"body"]; 

    [nodeData setObject:@"storage_item" forKey:@"type"]; 

    NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 

    [dict setObject: [NSString stringWithFormat:@"%@", fid] forKey:@"fid"]; 
    NSLog(@"%@", fid); 

    NSDictionary *fidLangDict = [NSDictionary dictionaryWithObject:[NSArray arrayWithObject:dict] forKey:@"und"]; 

    [nodeData setObject:fidLangDict forKey:@"field_photo"]; 

    [DIOSNode nodeSave:nodeData success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Node saved!"); 


    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Node did not save!"); 
    }]; 
+0

Я не знаком с классом DIOSFile, но если время жизни этого объекта ответа короче, чем время жизни свойства fid, вы получите в свои руки зомби (указатель на нераспределенное пространство). Я бы изменил назначение на сильный в fid и сделал [[responseObject objectForKey: @ "fid"] copy]. –

+0

FYI - опасно использовать 'assign' для свойства указателя объекта. Предполагая, что вы используете ARC, используйте 'strong'. Или, если у вас действительно есть веская причина и полностью понять последствия, используйте «слабый». 'assign' следует использовать только для примитивных типов. – rmaddy

+0

@JoelMurphy Пробовал это; no dice:/ – Brittany

ответ

3

Вы вызываете асинхронный метод.

Оператор журнала «далее вниз» выполняется задолго до завершения метода fileSave. Два обратных вызова fileSave будут вызваны в далеком будущем (может быть, через несколько секунд).

Независимо от того, что вы хотите сделать, требуется fid, необходимо выполнить в блоке завершения файлаSave.

+0

Нет ли способа захватить то, что находится в responseObject, и использовать его вне метода fileSave? – Brittany

+0

Добавьте метод в класс, называемый -saveSuccess, и вызовите его из блока успеха. Добавьте NSLog там и посмотрите, работает ли он. –

+0

@JoelMurphy & gnasher729: Мне нужно иметь возможность использовать значение responseObject вне метода, чтобы эта строка работала: [nodeData setObject: fidLangDict forKey: @ "field_photo"]; Эта строка не устанавливает поле, если оно находится внутри блока fileSave. – Brittany

Смежные вопросы