我正在尝试在我的应用中实现后台刷新。我有一个方法refreshMessages
位于UIViewControllers
之一(我正在使用UINavigationController
)。我需要从AppDelegate.m
访问此控制器。
通常我会做这样的事情:
UINavigationController *navigationController = [self.window.rootViewController navigationController];
获取导航控制器,然后我可以从那里访问它们。但是现在肯定不会起作用。该应用程序位于BACKGROUND中,没有显示任何窗口。有关如何解决这个问题的任何想法?谢谢!
这是我的背景刷新:
-(void)application:(UIApplication *)application
performFetchWithCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"Doing the background refresh");
UINavigationController *navigationController = [self.window.rootViewController navigationController];
NSLog(@"Number of controllers is %d", [[navigationController viewControllers] count]);
//There are zero controllers?!!! Must be because no window is showing
completionHandler(UIBackgroundFetchResultNewData);
}
答案 0 :(得分:1)
是的,你是对的。 nil
将为AppDelegate
,因为它将不再位于视图层次结构中。
一个厚颜无耻的解决方案是通过在AppDelegate.h
中创建一个属性来保存视图控制器的引用。您可以通过在视图控制器中订阅相关通知,在应用程序转到后台时分配此项。
编辑:已添加代码
在@property (nonatomic, weak) YourViewController *yourViewController;
viewDidLoad
在YourViewController.m中,[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
中的某个地方
appWillResignActive
-(void)appWillResignActive:(id)sender {
YourAppDelegate *delegate = [UIApplication sharedApplication].delegate;
delegate.yourViewController = self;
}
的实施
[self.yourViewController refreshMessages]
在您的完成处理程序
中NSData *imageData = UIImageJPEGRepresentation(YOURIMAGE, 0.5);
NSDictionary * dicParamsToSend = @{@"room" : room,
@"description" : description };
AFHTTPRequestOperation *op = [manager POST:@"rest.of.url" parameters:dicParamsToSend constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
//do not put image inside parameters dictionary as I did, but append it!
[formData appendPartWithFileData:imageData name:@"image" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success: %@ <=> %@", operation.responseString, responseObject);
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@ <=> %@", operation.responseString, error);
}];
[op start];
此外,请确保在取消分配视图控制器后删除观察者。