在启用ARC的代码中,如何在使用基于块的API时修复有关潜在保留周期的警告?
警告:
Capturing 'request' strongly in this block is likely to lead to a retain cycle
由这段代码生成:
ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...
[request setCompletionBlock:^{
NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.rawResponseData error:nil];
// ...
}];
Run Code Online (Sandbox Code Playgroud)
警告与request块内对象的使用相关联.
cocoa cocoa-touch retain asihttprequest automatic-ref-counting
由于最近停止了ASIHTTPRequest的工作,似乎注意力转向AFNetworking.
但是,我还没有找到两个库的功能的良好比较,所以我不知道如果/当我切换时我可能会失去什么.
到目前为止我发现的主要差异是:
有没有人看到两个图书馆的任何良好比较或从一个图书馆转换到另一个图书馆的任何记录经验?
我正在重新思考我正在开发的大型应用程序的请求架构的方法.我目前正在使用ASIHTTPRequest实际发出请求,但由于在不同的视图控制器中采取了许多不同的操作,我需要许多不同类型的请求,因此我正在尝试找出组织这些请求的最佳系统.
我正在构建由应用代表保留的单身"请求者",并坐在那里听取需要发出请求信号的NSNotifications; 他们发出请求,听取响应,并发送带有响应数据的新NSNotification.这解决了我的大多数问题,但没有优雅地处理失败的请求或同时请求同一个单一请求者.
任何人都有成功设计一个清晰的OO架构,在iOS应用程序中制作许多不同类型的请求?
iphone cocoa-touch network-programming objective-c asihttprequest
我正在使用ASIhttprequest许多项目,但最近每个新项目,当我尝试添加ASIhttprequest类时,我在使用类之前得到以下错误,就在我尝试导入它们时:
使用配置Debug构建项目finjan的finjan
Ld build/Debug-iphonesimulator/finjan.app/finjan normal i386
cd /Users/Apple/Desktop/application/finjan
setenv MACOSX_DEPLOYMENT_TARGET 10.5
setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk -L/Users/Apple/Desktop/application/finjan/build/Debug-iphonesimulator -F/Users/Apple/Desktop/application/finjan/build/Debug-iphonesimulator -filelist /Users/Apple/Desktop/application/finjan/build/finjan.build/Debug-iphonesimulator/finjan.build/Objects-normal/i386/finjan.LinkFileList -mmacosx-version-min=10.5 -framework Foundation -framework UIKit -framework CoreGraphics -framework AudioToolbox -framework AVFoundation -o /Users/Apple/Desktop/application/finjan/build/Debug-iphonesimulator/finjan.app/finjan
Undefined symbols:
"_CFHTTPAuthenticationIsValid", referenced from:
-[ASIHTTPRequest attemptToApplyProxyCredentialsAndResume] in ASIHTTPRequest.o
-[ASIHTTPRequest attemptToApplyCredentialsAndResume] in ASIHTTPRequest.o
"_CFHTTPMessageApplyCredentialDictionary", referenced from:
-[ASIHTTPRequest applyAuthorizationHeader] in ASIHTTPRequest.o
-[ASIHTTPRequest applyAuthorizationHeader] in ASIHTTPRequest.o
-[ASIHTTPRequest applyProxyCredentials:] in ASIHTTPRequest.o
-[ASIHTTPRequest applyCredentials:] in ASIHTTPRequest.o
"_CFHTTPMessageIsHeaderComplete", referenced from:
-[ASIHTTPRequest readResponseHeaders] in ASIHTTPRequest.o
"_kCFStreamPropertyHTTPSProxyPort", …Run Code Online (Sandbox Code Playgroud) 我无法更改UILabel文本.viewDidLoad中UILabel的代码是:
startLabel=[[UILabel alloc] initWithFrame:CGRectMake(75, 395, 200, 30)];
startLabel.text=@"Recording Sound ...";
startLabel.backgroundColor=[UIColor clearColor];
startLabel.textColor=[UIColor whiteColor];
startLabel.font=[UIFont boldSystemFontOfSize:17];
[self.view addSubview:startLabel];
Run Code Online (Sandbox Code Playgroud)
稍后,如果我想使用以下代码更改文本的标签,则不会更改应用程序:
startLabel.text=@"Searching Database ...";
Run Code Online (Sandbox Code Playgroud)
要么
[startLabel setText:@"Searching Database ..."];
Run Code Online (Sandbox Code Playgroud)
UILabel不是空的,我在调试过程中打印出来,它显示:
(gdb) po startLabel
<UILabel: 0x2c1a30; frame = (75 395; 200 30); text = 'Searching Database ...';
clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x2ae8f0>>
Run Code Online (Sandbox Code Playgroud)
因此,标签的文本在UILabel内部发生变化,但未在屏幕上更新.
有谁可以让我知道我在这里失踪了什么?谢谢.
编辑1:我试过performSelectorOnMainThread:- 没有为我工作.编辑2:我正在使用AVFoundation和ASIHTTP类来录制声音并在此处上传录制的文件.没有其他的.没有使用任何线程.
我为这个冗长的问题提前道歉.我遇到了自签名SSL证书的问题,我想记录到目前为止我尝试过的所有内容.
我正在开发一个与REST服务通信的应用程序.测试服务器使用自签名的ssl证书,我可以在我的计算机上安装该证书.这是一个需要密码才能安装的.p12文件.如果未安装此证书,则对服务器的所有请求都将返回403.
.p12在Keychain中安装三个项目,一个"根证书颁发机构",一个由"根证书颁发机构"颁发的"测试用户"证书,以及一个与"测试用户"证书相关联的私钥.
我通过给自己发送.p12文件,在iPad上安装了这个证书.我点击附件,输入密码,现在我可以在Safari中访问该网站.不幸的是,由于应用程序沙盒,这还不足以让我的应用程序与REST服务进行通信.
我正在使用ASIHTTPRequest来完成与我的应用程序中的REST服务的所有通信.每个请求都是ASIHTTPRequest的子类.我发现我必须做的第一件事就是调用,[self setValidatesSecureCertificate:NO];以便它甚至可以尝试SSL连接到服务器.如果这就是我所做的,我会从服务中获得403错误代码.
现在我似乎无法弄清楚如何获得使用证书的请求.我已经尝试将这三个项目导出为单独的.cer文件,包括它们在项目中,并使用以下代码将它们添加到请求中:
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cert" ofType:@"cer"]];
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)data);
...
[self setClientCertificates:[NSArray arrayWithObjects:(id)cert, ..., nil]];
Run Code Online (Sandbox Code Playgroud)
虽然使用这种方法代码执行没有问题,但我仍然得到403错误.
我甚至尝试在我的应用程序中包含.p12文件并使用相同的代码导入它.这会失败,因为SecCertificateCreateWithData返回nil.
我承认我真的不知道我在这里做什么.这一切都在我头上,任何人都可以给我的任何帮助将不胜感激.
我即将开发一个iPad应用程序,它有大量的后台线程网络调用.
我想知道哪一个更好?ASIHTTPRequest仍然有效,但没有维护.然而,很少有消息称AFNetworking框架会产生许多复杂情况.
我正在调查AFNetworking作为替代品ASIHTTPRequest,并注意到它是否支持后台下载/上传完全缺乏信息.
使用ASIHTTPReqeust对象,您所要做的就是调用[request setShouldContinueWhenAppEntersBackground:YES],请求将在后台继续.这有什么支持AFNetworking吗?
我最近从ASIHTTPRequest迁移到AFNetworking,这非常棒.但是,我连接的服务器有一些问题,有时会导致我的请求超时.使用ASIHTTPRequest时,可以使用以下选择器在超时时为请求设置重试计数
-setNumberOfTimesToRetryOnTimeout:
Run Code Online (Sandbox Code Playgroud)
这篇文章可以进一步引用,可以重试ASIHTTPRequest吗?
如果你不熟悉这就是AFNetworking https://github.com/AFNetworking/AFNetworking#readme
我无法在AFNetworking中找到等效的api,是否有人找到了在使用AFNetworking超时的情况下重试网络请求的解决方案?
asihttprequest ×10
iphone ×7
ios ×6
afnetworking ×4
objective-c ×4
cocoa-touch ×2
ipad ×2
ssl ×2
cocoa ×1
https ×1
nsurlrequest ×1
retain ×1
uilabel ×1
xcode ×1