【问题标题】:IOS 7 AFNetworking 2.0 view refresh issueIOS 7 AFNetworking 2.0 查看刷新问题
【发布时间】:2014-11-03 15:30:12
【问题描述】:

首先我想说的是,我遇到的问题是关于我自己的代码是如何设置的,而不是 IOS 或 AFNetworking。

我将展示 1 个示例,其中即使从服务器接收到更新的 JSON 响应对象,视图也不会立即刷新。

第一个视图中使用了 2 个视图,下面的按钮将用户带到第二个视图,在那里他可以上传一张图像,然后将在第一个视图中显示。

- (IBAction)editImage:(id)sender {
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
TDUserProfileViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"TDUserProfileImageEditViewController"];
[self.navigationController pushViewController:vc animated:YES];
}

以下代码将新数据上传到服务器,然后获取有关服务器上图像地址的新数据。

- (IBAction)dataSubmitToServer{


//    NSLog(@"photo: %@", self.photoData);
 NSString * userID = [[NSUserDefaults standardUserDefaults] objectForKey:USERID];
//make the call to the web API
NSString* command = @"setProfilePhoto";
self.params =[NSMutableDictionary dictionaryWithObjectsAndKeys:command, @"command", userID, @"userid", nil];

//////////////////
NSLog(@"%@", self.params);


self.photoName = @"newname.png";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];



manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:BaseURLString parameters:self.params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

    [formData appendPartWithFileData:UIImageJPEGRepresentation(self.userPhoto.image, 1)
                                name:@"image"
                            fileName:self.photoName
                            mimeType:@"image/jpeg"];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {


    NSLog(@"JSON: %@", responseObject);

       } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    NSLog(@"Error: %@", [error localizedDescription]);

    [TDPublicFunctions showDefaultAlert:@"Error" body:[error description]];
}];

[self getNewProfileData];


[[NSUserDefaults standardUserDefaults] synchronize];


}

-(void)getNewProfileData{
/*start getting new data for profile pic and status message*/

NSString* command = @"displayProfileData";

NSString * userID = [[NSUserDefaults standardUserDefaults]  objectForKey:USERID];

NSMutableDictionary* params =[NSMutableDictionary dictionaryWithObjectsAndKeys:command, @"command",  userID,@"userid", nil];

NSLog( @"%@", params);
[SVProgressHUD showWithStatus:@"Loading..." maskType:SVProgressHUDMaskTypeBlack];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:BaseURLString parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
    [SVProgressHUD dismiss];
    if([responseObject objectForKey:@"error"])
    {
        [[[UIAlertView alloc] initWithTitle:@"Data Retrieval Error" message:[responseObject description] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] show];
    }
    else
    {
        NSString * profilePhoto = [[[responseObject objectForKey:@"result"] objectAtIndex:0] objectForKey:@"profile_picture"];
        NSString * status = [[[responseObject objectForKey:@"result"] objectAtIndex:0] objectForKey:@"status"];
        NSString * statusMsg = [[[responseObject objectForKey:@"result"] objectAtIndex:0] objectForKey:@"status_message"];

        if(profilePhoto && ![profilePhoto isKindOfClass:[NSNull class]])
            [[NSUserDefaults standardUserDefaults] setObject:profilePhoto forKey:PROFILE_PHOTO];
        if(status && ![status isKindOfClass:[NSNull class]])
            [[NSUserDefaults standardUserDefaults] setObject:status forKey:STATUS];
        if(statusMsg && ![statusMsg isKindOfClass:[NSNull class]])
            [[NSUserDefaults standardUserDefaults] setObject:statusMsg forKey:STATUS_MESSAGE];

    }

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
//end of getting data for status message and profile pic
}

现在,一旦上述过程结束,HUD 应该会停止,当点击视图上的后退按钮时,第一个视图中应该会出现新上传的图像。下面的代码是我为了让图像刷新视图而尝试的许多事情中的最后一个: -(void) viewWillAppear:(BOOL)动画 {

NSString * profPic = [[NSUserDefaults standardUserDefaults] objectForKey:PROFILE_PHOTO];
NSLog(@"profilepic: %@", profPic);
//    NSString* status = [[NSUserDefaults standardUserDefaults] objectForKey:STATUS];
NSString * statusMsg = [[NSUserDefaults standardUserDefaults] objectForKey:STATUS_MESSAGE];
if(profPic)
    [photo loadIconForProduct:profPic];

if(statusMsg)
    statusMsgView.text = statusMsg;

//self.view=nil;
//[self viewDidLoad];
[self getFriendsList];
[photo setNeedsDisplay];
[self.view setNeedsDisplay];
}

上传图片后,第一次上传图片时可能会起作用,但如果用户再次按下editImage按钮并上传另一张图片,则不起作用。

做错了什么?如果还有什么我可以提供的,请告诉我。

谢谢。

【问题讨论】:

  • 只是我的两分钱。在网址末尾添加一个随机数,例如...image.jpg?rand=6547,这样每次图像网址都被视为新网址。
  • 试过了,还是要注销重新登录才能看到新的图片。为了解决这个问题,有什么我没有做的事情有人可能会建议吗?

标签: ios ios7 uiviewcontroller afnetworking


【解决方案1】:

正如我在此处看到的,您将返回一个 URL 作为 profilePhoto 的结果。所以你不妨使用 AFNetworking 功能:

我假设照片是 UIImageView。

[photo setImageWithURL:[NSURL URLWithString:profPic] placeholderImage:[UIImage imageNamed:@"somePlaceholderImage"]];

【讨论】:

  • 好的,我明白了,我可以使用 AFNetworking 来加载图像。我会尝试一下,但我注意到视图上的其他动态数据(基本标签文本)也没有重新加载。为了确保视图上的数据重新加载,有什么我目前没有做的事情吗?
  • 从上面的代码中,我的理解是这样的,如果我错了,请纠正我:用户点击一个UIButton,一个视图控制器被推送,一些数据被上传,接下来会发生什么?
  • 使用了 2 个视图。按钮将用户从视图 1 带到视图 2。在视图 2 中上传图像。用户然后点击后退按钮并返回到视图 1,应该显示新图像。在视图 1 中,还有一个 btn 将用户带到视图 2,其中用户输入文本,然后将其上传到服务器。用户然后点击后退按钮并返回到视图 1,其中应该有一个带有刚刚上传的文本的标签。如果我完全退出应用程序并返回视图,更新的数据会正确显示。我需要在用户点击后退按钮时更新数据。
  • 我认为您的问题不在于重新加载数据,而在于获取图像的 AFNetworking 功能。您可能已经知道它是异步的。所以我最好的猜测是,当你加载 view1(从 view2 返回)时,仍然没有检索到数据,所以 view1 基本上什么都没有重新加载。所以这就是为什么当你测试它的时候,当你试图显示数据时,它已经被检索到了,但是当视图加载它时却没有。
猜你喜欢
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多