2016-11-12 132 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