在通过NSOperation构建时,ASIHttpRequest的帖子主体有时为空

时间:2011-09-01 19:33:49

标签: objective-c ios memory-leaks asihttprequest

我有一个设置,我正在使用ASIHttpRequest在后台NSOperation子类中进行服务调用。我从NSOperation中的main()调用一个方法,并使用适当的URL,标题,正文等来构建我的请求。问题是我偶尔会看到请求体设置为null而不是期望值。在将其设置为请求之前打印出预期正文应该是什么,并且该表示形式为非null,因此我不知道ASIHttpRequest的请求主体在何处/如何被释放。

以下是我如何设置请求体的示例代码...此方法由另一个控制整个网络工作流的驱动程序方法调用。反过来,该方法由我的NSOperation的main()方法调用。

 + (ASIHTTPRequest*) buildRequestForProjectModify: (ANVideoProject*) theProject {

    if (theProject.selfUrl == nil) return nil; //Can't do anything if we don't have a project url. 

    NSString* projectPutUrl = theProject.selfUrl;
    ASIFormDataRequest* request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:projectPutUrl]];
    [ANAppsServiceHelper addStandardHeadersToRequest:request];

    NSDictionary* projectDict = [theProject jsonFriendlyForSaveAndPreview];
    ANLogInfo(@"\n\nProject Post body: \n%@\n\n", projectDict); //This will print out ok
    ANLogInfo(@"\n\nProject Post Body as JSON\n%@\n\n", [projectDict JSONRepresentation] ); //this too prints out ok. 
    NSString* jsonRep = [projectDict JSONRepresentation];
    NSData* pd = [jsonRep dataUsingEncoding:NSUTF8StringEncoding];
    [request appendPostData:pd];
    [request setRequestMethod:@"PUT"];


    return request; //I have a problem in the calling method from here where the request body is now null. 
}

我读到了关于在我的NSOperation子类的main方法中设置自动释放池的问题,所以我在main方法的顶部做了这个。当我这样做时,请求体的(null)的出现被减轻了,但是仍然发生了大约1/4的时间我调用了这个操作。奇怪的是,请求的其他部分似乎没有以这种随机方式(即请求方法或标头)设置为null。这是我在上面提到的驱动程序方法的日志输出,打印出返回的请求:

Here is Modify the request: https://<service-url>/projects/p0FvVjc790MFWduhhqUStA
Here is the request headers: {
    Accept = "application/json";
    "Accept-Encoding" = gzip;
    Authorization = "Bearer <key>";
    "Content-Length" = 293;
    "Content-Type" = "application/json";
    "User-Agent" = "iPhone (OS 4.3.2)";
}
Here is the request method: PUT
Here is the request body: (null)

更新

所以我注意到的一件事是,有时请求体是空的,有时在请求体的末尾添加了一些垃圾数据(有时请求体完全没问题)。更奇怪的是,请求实际上总是成功通过我想要添加的正文(即使打印输出看起来很糟糕)。这表明ASIHttpRequest中的事情还可以,但是可能会出现我如何打印出我的请求状态或ASIHttpRequest与我正在使用的SBJSon库之间的其他问题,导致请求看起来已损坏的时间到时间(即使它显然不是)。

1 个答案:

答案 0 :(得分:0)

您是否打印出pd(NSData *)的内容?尺寸很大吗?然后,您可能需要从磁盘传输数据:

[request setRequestMethod:@"PUT"];
[request setPostBodyFilePath:@"/Users/ben/Desktop/another-big-one.txt"];
[request setShouldStreamPostDataFromDisk:YES];