菜鸟教程小白 发表于 2022-12-12 21:52:39

ios - RestKit 0.20 - 发布多个对象


                                            <p><p>我正在创建一个具有离线模式的任务应用程序。我几乎已经使用 RestKit 成功创建了在线模式。</p>

<p>在离线模式下,我将每个对象的 <code>isSync</code> 属性设置为 <code>false</code>,这样当网络可用时,我可以使用谓词获取这些未同步的对象并发布它们到服务器。</p>

<p>不幸的是,我找不到使用 RestKit 一次性将这些对象的数组<code>POST</code> 到服务器的方法。 </p>

<p>RestKit 支持这个吗?或者有没有更好的方法来使用 RestKit 实现离线支持?</p>

<p><strong>更新:</strong></p>

<p>我找到了方法<a href="https://stackoverflow.com/questions/18232620/restkit-0-20-how-to-post-get-more-than-1-managed-object-without-a-wrapper-class" rel="noreferrer noopener nofollow">here</a> ,创建具有 <code>NSArray</code> 属性的中间 <code>Entity</code> (具有自己的映射),可以 POST 到服务器。 </p>

<p>但是我有许多需要离线功能的实体(笔记、任务、评论...等),我是否必须为每个原始实体创建一个额外的中间实体? (这样每个人的响应都可以在我原来的实体中正确映射)</p>

<p><strong>更新 2:</strong></p>

<p>访问后<a href="https://github.com/RestKit/RestKit/issues/398" rel="noreferrer noopener nofollow">here</a> ,我发现现在在 RestKit 0.20.0 中支持发布多个对象的数组。但是每当我发布一组对象时,都不会向服务器发送任何参数。我就是这样做的:</p>

<pre><code>[DBTasks createTask:task attachments:nil completionHandler:^(DBTasks *task, NSError *error) {
            isPosting = NO;
            ;
            if (!error) {
                KLog(@&#34;task is %@&#34;, task); // works perfect
                ;
                ;

            } else {
                KLog(@&#34;error %@&#34;, error);
            }
      }];
</code></pre>

<p>这是我实际发送 POST 请求的方法:</p>

<p>(只考虑 <code>else</code> 部分)</p>

<pre><code>+ (void)createTask:(DBTasks *)task attachments:(NSArray *)attachments completionHandler:(void (^)(DBTasks *, NSError *))completionHandler {

    if (attachments != nil &amp;&amp; attachments.count &gt; 0) {
      NSMutableURLRequest *request =[ multipartFormRequestWithObject:task
                                                                                             method:RKRequestMethodPOST
                                                                                                 path:URL_TASKS
                                                                                           parameters:@{@&#34;total_attachments&#34;: }
                                                                            constructingBodyWithBlock:^(id&lt;AFMultipartFormData&gt; formData) {

                                                                              int counter = 0;
                                                                              for (NSDictionary *dic in attachments) {
                                                                                    , 0.7)
                                                                                                                name:&#34;, counter]
                                                                                                            fileName:
                                                                                                            mimeType:@&#34;image/jpg&#34;];

                                                                                    counter++;
                                                                              }
                                                                            }];

      RKObjectRequestOperation *operation = [ managedObjectRequestOperationWithRequest:request
                                                                                                   managedObjectContext:
                                                                                                                success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                                                                                                  KLog(@&#34;success&#34;);
                                                                                                                  completionHandler((DBTasks *), nil);

                                                                                                                } failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                                                                                                  KLog(@&#34;fail&#34;);
                                                                                                                  completionHandler(nil, error);
                                                                                                                }];
      ;

    }

    // without attachment
    else {
      [ postObject:task path:URL_TASKS parameters:nil
                                          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                                completionHandler((DBTasks *), nil);
                                          }
                                          failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                                completionHandler(nil, error);
                                          }];
    }
}
</code></pre>

<p>以下是映射:</p>

<pre><code>- (RKEntityMapping *)tasksMapping {

    RKEntityMapping *tasksMapping = ;
    tasksMapping.setDefaultValueForMissingAttributes = NO;
    tasksMapping.deletionPredicate = ;
    ;
    tasksMapping.identificationAttributes = @[@&#34;id&#34;];

    ];

    ;


    ];
    ];
    ];
    ];

    return tasksMapping;
}
</code></pre>

<p>POST/PUT/DELETE 使用相同的映射,但需要调用 <code>inverseMapping</code> 方法。</p>

<p>现在当我用数组调用 <code>postObject</code> 时:</p>

<pre><code> attachments:nil completionHandler:^(NSArray *array, NSError *error) {
            isPosting = NO;
            ;
            if (!error) {
                KLog(@&#34;Array of objects is %@&#34;, array);
                ;
                ;

            } else {
                KLog(@&#34;error %@&#34;, error);
            }
      }];
</code></pre>

<p>使用几乎以前的方法:</p>

<pre><code>+ (void)createTasks:(NSArray *)tasksArray attachments:(NSArray *)attachments completionHandler:(void (^)(NSArray *, NSError *))completionHandler {
    [ postObject:tasksArray path:URL_TASKS parameters:nil
                                        success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                          completionHandler(mappingResult.array, nil);
                                        }
                                        failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                          completionHandler(nil, error);
                                        }];
}
</code></pre>

<p>应用程序被终止</p>

<pre><code>2014-05-05 16:18:30.692 MyApp D restkit.object_mapping:RKMapperOperation.m:377 Executing mapping operation for representation: (
      {
      attachments =         (
      );
      &#34;completed_at&#34; = &#34;&lt;null&gt;&#34;;
      &#34;created_at&#34; = &#34;&lt;null&gt;&#34;;
      deleted = 0;
      &#34;due_date&#34; = &#34;&lt;null&gt;&#34;;
      from = &#34;Stand-alone task&#34;;
      id = &#34;&lt;null&gt;&#34;;
      note = &#34;&lt;null&gt;&#34;;
      owner = &#34;&lt;null&gt;&#34;;
      private = 0;
      &#34;send_email&#34; = &#34;&lt;null&gt;&#34;;
      status = &#34;&lt;null&gt;&#34;;
      tags =         (
      );
      title = &#34;&lt;null&gt;&#34;;
      &#34;total_attachments&#34; = 0;
      &#34;total_comments&#34; = 0;
      type = Task;
      &#34;updated_at&#34; = &#34;&lt;null&gt;&#34;;
      url = &#34;http://10.28.79.98:3000/workspace/tasks?open=task_&#34;;
      &#34;user_id&#34; = 26894;
    }
)
and targetObject: (null)
2014-05-05 16:18:30.693 MyApp D restkit.object_mapping:RKMapperOperation.m:297 Found mappable collection at keyPath &#39;&#39;: (
      {
      attachments =         (
      );
      &#34;completed_at&#34; = &#34;&lt;null&gt;&#34;;
      &#34;created_at&#34; = &#34;&lt;null&gt;&#34;;
      deleted = 0;
      &#34;due_date&#34; = &#34;&lt;null&gt;&#34;;
      from = &#34;Stand-alone task&#34;;
      id = &#34;&lt;null&gt;&#34;;
      note = &#34;&lt;null&gt;&#34;;
      owner = &#34;&lt;null&gt;&#34;;
      private = 0;
      &#34;send_email&#34; = &#34;&lt;null&gt;&#34;;
      status = &#34;&lt;null&gt;&#34;;
      tags =         (
      );
      title = &#34;&lt;null&gt;&#34;;
      &#34;total_attachments&#34; = 0;
      &#34;total_comments&#34; = 0;
      type = Task;
      &#34;updated_at&#34; = &#34;&lt;null&gt;&#34;;
      url = &#34;http://10.28.79.98:3000/workspace/tasks?open=task_&#34;;
      &#34;user_id&#34; = 26894;
    }
)
2014-05-05 16:18:30.694 MyApp CoreData: error: Failed to call designated initializer on NSManagedObject class &#39;DBTasks&#39;
2014-05-05 16:18:30.694 MyApp D restkit.object_mapping:RKMapperOperation.m:231 Asked to map source object {
    attachments =   (
    );
    &#34;completed_at&#34; = &#34;&lt;null&gt;&#34;;
    &#34;created_at&#34; = &#34;&lt;null&gt;&#34;;
    deleted = 0;
    &#34;due_date&#34; = &#34;&lt;null&gt;&#34;;
    from = &#34;Stand-alone task&#34;;
    id = &#34;&lt;null&gt;&#34;;
    note = &#34;&lt;null&gt;&#34;;
    owner = &#34;&lt;null&gt;&#34;;
    private = 0;
    &#34;send_email&#34; = &#34;&lt;null&gt;&#34;;
    status = &#34;&lt;null&gt;&#34;;
    tags =   (
    );
    title = &#34;&lt;null&gt;&#34;;
    &#34;total_attachments&#34; = 0;
    &#34;total_comments&#34; = 0;
    type = Task;
    &#34;updated_at&#34; = &#34;&lt;null&gt;&#34;;
    url = &#34;http://10.28.79.98:3000/workspace/tasks?open=task_&#34;;
    &#34;user_id&#34; = 26894;
} with mapping &lt;RKEntityMapping:0x10598240 objectClass=DBTasks propertyMappings=(
    &#34;&lt;RKAttributeMapping: 0x10599660 completed_at =&gt; completed_at&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x10599670 created_at =&gt; created_at&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x10599680 due_date =&gt; due_date&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x10599690 id =&gt; id&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x105996a0 note =&gt; note&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x105996b0 private =&gt; private&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x105996c0 send_email =&gt; send_email&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x105996d0 status =&gt; status&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x105996e0 title =&gt; title&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x105996f0 type =&gt; type&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x10599700 updated_at =&gt; updated_at&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x10599710 user_id =&gt; user_id&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x10599720 parent_id =&gt; parent_id&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x10599730 total_attachments =&gt; total_attachments&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x10599740 url =&gt; url&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x10599750 from =&gt; from&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x10599760 total_comments =&gt; total_comments&gt;&#34;,
    &#34;&lt;RKAttributeMapping: 0x10599870 deleted =&gt; shouldBeDeleted&gt;&#34;,
    &#34;&lt;RKRelationshipMapping: 0x1059b1c0 attachments =&gt; attachments&gt;&#34;,
    &#34;&lt;RKRelationshipMapping: 0x1059c5f0 owner =&gt; owner&gt;&#34;,
    &#34;&lt;RKRelationshipMapping: 0x1059dca0 additional_owners =&gt; additional_owners&gt;&#34;,
    &#34;&lt;RKRelationshipMapping: 0x105a1e00 tags =&gt; tags&gt;&#34;
)&gt;
2014-05-05 16:18:30.695 MyApp D restkit.object_mapping:RKMappingOperation.m:952 Starting mapping operation...
2014-05-05 16:18:30.696 MyApp D restkit.object_mapping:RKPropertyInspector.m:130 Cached property inspection for Class &#39;DBTasks&#39;: {
    &#34;additional_owners&#34; =   {
      isPrimitive = 0;
      keyValueCodingClass = NSSet;
      name = &#34;additional_owners&#34;;
    };
    attachments =   {
      isPrimitive = 0;
      keyValueCodingClass = NSSet;
      name = attachments;
    };
    &#34;completed_at&#34; =   {
      isPrimitive = 0;
      keyValueCodingClass = NSDate;
      name = &#34;completed_at&#34;;
    };
    &#34;created_at&#34; =   {
      isPrimitive = 0;
      keyValueCodingClass = NSDate;
      name = &#34;created_at&#34;;
    };
    &#34;due_date&#34; =   {
      isPrimitive = 0;
      keyValueCodingClass = NSDate;
      name = &#34;due_date&#34;;
    };
    from =   {
      isPrimitive = 0;
      keyValueCodingClass = NSString;
      name = from;
    };
    id =   {
      isPrimitive = 0;
      keyValueCodingClass = NSNumber;
      name = id;
    };
    note =   {
      isPrimitive = 0;
      keyValueCodingClass = NSString;
      name = note;
    };
    owner =   {
      isPrimitive = 0;
      keyValueCodingClass = DBContacts;
      name = owner;
    };
    &#34;parent_id&#34; =   {
      isPrimitive = 0;
      keyValueCodingClass = NSNumber;
      name = &#34;parent_id&#34;;
    };
    private =   {
      isPrimitive = 0;
      keyValueCodingClass = NSNumber;
      name = private;
    };
    &#34;send_email&#34; =   {
      isPrimitive = 0;
      keyValueCodingClass = NSNumber;
      name = &#34;send_email&#34;;
    };
    shouldBeDeleted =   {
      isPrimitive = 0;
      keyValueCodingClass = NSNumber;
      name = shouldBeDeleted;
    };
    status =   {
      isPrimitive = 0;
      keyValueCodingClass = NSNumber;
      name = status;
    };
    tags =   {
      isPrimitive = 0;
      keyValueCodingClass = NSSet;
      name = tags;
    };
    title =   {
      isPrimitive = 0;
      keyValueCodingClass = NSString;
      name = title;
    };
    topic =   {
      isPrimitive = 0;
      keyValueCodingClass = DBTopics;
      name = topic;
    };
    &#34;total_attachments&#34; =   {
      isPrimitive = 0;
      keyValueCodingClass = NSNumber;
      name = &#34;total_attachments&#34;;
    };
    &#34;total_comments&#34; =   {
      isPrimitive = 0;
      keyValueCodingClass = NSNumber;
      name = &#34;total_comments&#34;;
    };
    type =   {
      isPrimitive = 0;
      keyValueCodingClass = NSString;
      name = type;
    };
    &#34;updated_at&#34; =   {
      isPrimitive = 0;
      keyValueCodingClass = NSDate;
      name = &#34;updated_at&#34;;
    };
    url =   {
      isPrimitive = 0;
      keyValueCodingClass = NSString;
      name = url;
    };
    &#34;user_id&#34; =   {
      isPrimitive = 0;
      keyValueCodingClass = NSNumber;
      name = &#34;user_id&#34;;
    };
}
2014-05-05 16:18:30.698 MyApp *** Terminating app due to uncaught exception &#39;NSInvalidArgumentException&#39;, reason: &#39;*** setObjectForKey: key cannot be nil&#39;
*** First throw call stack:
(
    0   CoreFoundation                      0x034721e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x02be48e5 objc_exception_throw + 44
    2   CoreFoundation                      0x034fbeb8 - + 888
    3   MyApp                         0x002dad3a __61-_block_invoke61 + 154
    4   libdispatch.dylib                   0x04ce17b8 _dispatch_call_block_and_release + 15
    5   libdispatch.dylib                   0x04cf64d0 _dispatch_client_callout + 14
    6   libdispatch.dylib                   0x04ce4047 _dispatch_queue_drain + 452
    7   libdispatch.dylib                   0x04ce3e42 _dispatch_queue_invoke + 128
    8   libdispatch.dylib                   0x04ce4de2 _dispatch_root_queue_drain + 78
    9   libdispatch.dylib                   0x04ce5127 _dispatch_worker_thread2 + 39
    10libsystem_pthread.dylib             0x05025dab _pthread_wqthread + 336
    11libsystem_pthread.dylib             0x05029cce start_wqthread + 30
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
</code></pre>

<p>任何建议我做错了什么?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>问题与发送数组无关,这是由于您的核心数据堆栈设置所致。你的两种情况有很大的不同。一个有效的使用魔法记录中的默认上下文。不使用对象管理器及其关联的对象存储的那个 - 似乎没有配置。</p>

<p>从代码和错误来看,发布没有附件的单个任务也应该会失败。</p>

<p>检查您的核心数据堆栈创建以及与对象管理器的关联。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - RestKit 0.20 - 发布多个对象,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/23380725/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/23380725/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - RestKit 0.20 - 发布多个对象