- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在一个小型 iOS 应用程序中,我需要从服务器检索一些 JSON(类似于 DNS 请求),并使用此响应来发起进一步的连接。为此,我有一个使用 NSURLSession 处理 JSON 请求的对象。该对象接收主对象 (MainController) 作为委托(delegate),并在 JSON 数据可用时调用方法。这是 MainController 中的调用:
- (void)serverResolve:(NSString *)serverID withPass:(NSString *)pass {
// Must retrieve the server list from JSON
ServerListRetriever *slCom = [[ServerListRetriever alloc] init];
slCom.delegate = self;
[slCom searchServer:serverID usingPass:pass];
}
我的问题是,一旦completionHandler开始运行,MainController就不会做它应该做的事情。我不知道为什么???
这是 ServerListRetriever 的内容( header ):
#import "ServerListRetrieverDelegate.h"
@interface ServerListRetriever : NSObject
@property (assign, nonatomic) id <ServerListRetrieverDelegate> delegate;
- (void)searchServer:(NSString *)serverID usingPass:(NSString *)pass;
@end
...(和实现)
#import "ServerListRetriever.h"
#define SERVER_LIST @"https://www.example.com/hosts.json"
@implementation ServerListRetriever
- (void)searchServer:(NSString *)serverID usingPass:(NSString *)pass
{
// This will work...
[self.delegate serverConnect:@"https://www.example.net/" withPass:pass];
return;
// And if removing the above two lines, this won't work
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:SERVER_LIST]
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
// Handle response
if (error) {
[self.delegate serverListFailedWithError:error];
} else {
// NSLog(@"Retrieved JSON: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
// Extract the server URL
NSError *jsonError = nil;
NSDictionary *parsedObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (jsonError) {
[self.delegate serverListFailedWithError:jsonError];
return;
}
NSString *serverURL = [parsedObject objectForKey:serverID];
NSLog(@"Resolved server URL: %@", serverURL);
// Continue with connection
[self.delegate serverConnect:serverURL withPass:pass];
}
}] resume];
}
@end
方法serverConnect
在这两种情况下都会运行,但是当由completionHandler调用时,很多想法将无法正常工作。我已经通过调试检查了委托(delegate),并且在这两种情况下它具有相同的 ID。
由于我仍在 iOS 上的内存管理方面苦苦挣扎,过早丢失一些对象可能是一个解释。然而,我缺乏定位问题的经验。感谢您的想法和建议!
最佳答案
关于代表是否应该强大一直存在争论。如果它们很弱,那么您保证不会出现保留循环,但这也意味着如果委托(delegate)没有被其他人保留,它可能会在异步操作完成之前消失。
通常处理这种情况的方法是制作委托(delegate)的强大内部副本,例如
@interface ServerListRetriever ()
@property (strong, nonatomic) id <ServerListRetrieverDelegate> strongDelegate;
@end
...
// When an operation is started:
self.strongDelegate = self.delegate;
// When the *last* operation ends (keep an array of operations or something):
self.strongDelegate = nil;
或者,您可以将公共(public)委托(delegate)属性标记为强,但您需要在使用完毕后显式将 ServerListRetriever
的委托(delegate)清空,或者将最后一个引用清空ServerListRetriever
对象本身。
关于ios - NSURLSession 和代表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43798152/
我正在尝试在我的 UITableView 上调用 reloadData。我在没有界面生成器的情况下制作我的应用程序。 此代码适用于 Interface Builder,但似乎没有。 当我将我的代码与我
有人可以解释 UIAlertView 的委托(delegate)是如何工作的吗?它是自动调用还是我必须调用它?例如: - (void)alertView:(UIAlertView *)alertVie
编辑:好吧,根据其他人的建议,我创建了一个最小的示例......并且它有效,因此我将在未来与任何人分享它。这是工作代码: #include #include using namespace std
unicode 是 ,它被用在 XML 文档中。 最佳答案 查看图表:unicodelookup.com 换行符。 关于html - unicode字符是什么 代表?,我们在Stack Overflo
我有一个应用程序,可以以编程方式在配置的 Facebook 页面上发帖。我的应用程序显然已批准管理页面和发布页面权限,并且我正在使用页面访问 token 从现在开始一切正常,但最近当我在页面提要上发布
代表 NCAA 男子篮球分组的最佳数据库模式是什么?如果您不熟悉,请点击以下链接:http://www.cbssports.com/collegebasketball/mayhem/brackets/
所以我一直在阅读这个关于如何使用 Frida 的教程:https://www.frida.re/docs/functions/我遇到过以下情况: $ ./client 127.0.0.1 connec
委托(delegate)函数返回之前是否需要调用replyHandler?我需要进行几次 Web 服务 API 调用才能回复,以下实现正确吗? func session(_ session: WCSe
下面提到的是我的 textField 委托(delegate)方法,我正在使用 IQKeyBoardSwift 作为智能键盘。我尝试移除我的键盘,但我仍然没有收到任何关于接受“开始触摸”的方法的调用
我有一个表格 View ,其中几乎没有用于数据输入的文本字段和弹出窗口。我想将其中一些表示为强制性的。我不知道如何讨厌星号。任何帮助将不胜感激。 最佳答案 我认为你可以使用自定义 UITableVie
例如,我知道如何使用 numpy 对数组进行切片 v[1, :, :] 现在我想要一个函数将切片 (1,1,None) 作为输入并返回 v[1,:,:] 问题是我不知道如何表示省略号 最佳答案 您可以
修订... 应用程序的关键是与数据库服务器通信。服务器对应用程序的响应都是 XML 格式的。有几个屏幕。例如,屏幕 1 列出了用户的信息,屏幕 2 列出了用户过去的交易,允许新交易,等等。 这是我的
我想知道映射/表示内存的最佳方式是什么。我的意思是,例如,如何描述一个结构及其所有字段都被序列化。 我正在创建一个 RPC 库,它将使用 dwarf 调试数据创建客户端和服务器,因此我需要创建一个函数
如果我有一个实现了两个协议(protocol)的 View Controller : @interface CustomerOperationsViewController : UIViewContr
在 Objective-C 中我可以做这样的事情: @property (nonatomic, weak) id someObject; 如何在swift中做到这一点?我试过这个: let someO
我成功地使用了相当棒的 connection:didReceiveAuthenticationChallenge: NSURLConnectionDelegate 委托(delegate)方法。很酷。
我正在寻找原始数据类型的 @NonNull 等效 Java 注释。我知道原始数据不能为 null,但我找不到替代方法。 我想要实现的在逻辑上等同于: int mPageNumber; public v
我正在学习 Git,如果我能描述代表 Git 存储库的数学结构,那就太好了。例如:它是一个有向无环图;它的节点代表提交;它的节点有代表分支等的标签(每个节点最多一个标签,没有标签使用两次)。(我知道这
我看过很多与委托(delegate)相关的帖子,我想知道引用它们的正确方法。假设我有一个声明如下的对象: @interface MyViewController : UITableViewContro
我有这个类: public class Order { int OrderId {get; set;} string CustomerName {get; set;} } 我也声明下面的变
我是一名优秀的程序员,十分优秀!