2016-11-12 130 views
0

有没有愿意帮助我解决这个问题的人?RACSignal:不执行RACSignal代码

这是我的情景:

我需要形式的附件上传到服务器。因此,这里的步骤:

  1. 使用Web服务从服务器检索附件头。

  2. 将附件标题与本地附件匹配。

  3. 上传附件到服务器。

问题:

使用RACSignal我可以成功地获得附加的信息,但是当它的时间来上传使用的NSArray的UploadFormItemAttachments方法将不执行的内RACSignal附件。

附加信息:

这是代码片段,显示RACSignals的处理方式。 BatchSignal永远不会执行!:

[[[self getFormItemAttachmentHeaders:listName 
          topListItemID:form.topListItemID 
            form:form 
    ] map:^id(NSMutableArray* value) { 
     NSArray* attachmentHeaders = [value copy]; 

     // the code of uploadFormItemAttachments is called but the inner signal does not execute. Why? 
     return [self uploadFormItemAttachments:pendingAttachments 
             attachmentHeaders:attachmentHeaders 
                form:form]; 
     } 
     ] subscribeNext:^(id value) { 
      // I was expecting the completion result form uploadFormItemAttachments here. 
     } 
    ]; 

这是在附件遍历数组,并上传到服务器的方法:

- (RACSignal *)uploadFormItemAttachments:(NSArray*)pendingAttachments attachmentHeaders:(NSArray*)attachmentHeaders form:(SEFSManagedForm*)form 
{ 

    RACSignal* batchSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { 
    [attachmentHeaders enumerateObjectsUsingBlock:^(SEFSFormItemAttachmentHeader* attachmentHeader, NSUInteger idx, BOOL *stop) 
    { 
     // Look for the local attachment using attachment header from server 

     NSPredicate* predicate = [NSPredicate predicateWithFormat:@"identifier = %@", attachmentHeader.document]; 
     NSArray* foundAttachment = [pendingAttachments filteredArrayUsingPredicate:predicate]; 

     SEFSManagedAttachment* fullAttachment = foundAttachment[0]; 

     RACSignal* uploadFormItemAttachmentSignal = [[self uploadFormItemAttachment:fullAttachment 
                    attachmentHeader:attachmentHeader               ] map:^id(NSNumber* value) { 
     NSMutableArray* valuesArray = [NSMutableArray array]; 
     [valuesArray addObject:value]; 
     [valuesArray addObject:attachmentHeader.document]; 
     RACTuple* tuple = [RACTuple tupleWithObjectsFromArray:valuesArray 
              convertNullsToNils:YES]; 
     return tuple; 
     }]; 


     [subscriber sendNext:uploadFormItemAttachmentSignal]; 
    }]; 

    [subscriber sendCompleted]; 
    return nil; 
    }]; 

    return [batchSignal flatten:2]; 
} 

回答

0

由于uploadFormItemAttachments回报RACSignal你应该使用flattenMap代替map