代码之家  ›  专栏  ›  技术社区  ›  Mausimo

如何在SOAP请求完成之前暂停/停止函数

  •  2
  • Mausimo  · 技术社区  · 14 年前

    编辑:我遇到的问题是我正在使用TapKu日历,所以我依赖于提供的代理。问题是:

    - (NSArray*) calendarMonthView:(TKCalendarMonthView*)monthView marksFromDate:(NSDate*)startDate toDate:(NSDate*)lastDate{
    
    //SOAP Request has NSURLConnection which runs asychonrous delegate methods.
    //SOAP Request will return before the data array has been populated
    [self SOAPRequest:startDate];
    
    //i need to do something like this, however the SOAPRequest will return and get stuck into the loop instead of the asychronos delegates firing
    //therefore i can never set bGettingData to NO.
    int iWait;
    while (bGettingData) {
        iWait++;
    }
    
    return dataArray;
    

    }

    你好,

    在我正在创建的应用程序中,我依赖于SOAP请求来检索数据、解析XML并填充数组。

    我遇到的问题是,当我检查数组时它是空的,因为SOAP请求没有完成。在SOAP请求完成并恢复代码之前,如何停止代码的执行?这可以通过回调或线程来完成吗?

    谢谢

    5 回复  |  直到 14 年前
        1
  •  1
  •   hotpaw2    14 年前

    不要暂时停止,睡眠或等待,而只是退出/退出/返回从当前的例程/功能/方法。

    把你当前的“东西”分成多个代码片段,每个片段都有自己的方法。

    使用后续方法执行接下来的操作,并让异步网络/SOAP请求的完成例程调用该方法。

    基本上,您的问题是您仍然在考虑过程编码。正确的范例是使用事件驱动编码:让操作系统调用代码,而不是让代码调用操作系统并等待。

        2
  •  0
  •   Joe    14 年前
        3
  •  0
  •   Community Jaime Torres    7 年前

    您确实希望等待答案完成-回调通常是最简单的。具体如何依赖于您正在使用的编程库/语言(在上面的javascript、objectiveC中,您是手工编写代码还是从一个示例开始)。

    查看答案 Iphone SOAP request step by step tutorial -例如 http://macresearch.org/interacting-soap-based-web-services-cocoa-part-1 http://brismith66.blogspot.com/2010/05/iphone-development-accesing-soap.html . 或跟随 https://developer.omniture.com/node/321 -它只是等待答案完全到达。

        4
  •  0
  •   Mausimo    13 年前

    不幸的是,当使用TapKu日历时,不能通过SOAP从数据库异步加载。您必须同步加载日历,因为在数据加载完成后,无法刷新日历视图。如果你每月有40多条记录,这将造成巨大的5-6秒延迟。

        5
  •  0
  •   pfrank    11 年前

    这确实是可能的,例如在“日日历”视图中,将refreshDataPageWithAtIndex修改为如下所示:

    - (void) _refreshDataWithPageAtIndex:(NSInteger)index{
    
        UIScrollView *sv = self.pages[index];
        TKTimelineView *timeline = [self _timelineAtIndex:index];
    
    
        CGRect r = CGRectInset(self.horizontalScrollView.bounds, HORIZONTAL_PAD, 0);
        r.origin.x = self.horizontalScrollView.frame.size.width * index + HORIZONTAL_PAD;
        sv.frame = r;
    
    
    
        timeline.startY = VERTICAL_INSET;
    
        for (UIView* view in sv.subviews) {
            if ([view isKindOfClass:[TKCalendarDayEventView class]]){
                [self.eventGraveYard addObject:view];
                [view removeFromSuperview];
            }
        }
    
        if(self.nowLineView.superview == sv) [self.nowLineView removeFromSuperview];
        if([timeline.date isTodayWithTimeZone:self.timeZone]){
    
            NSDate *date = [NSDate date];
            NSDateComponents *comp = [date dateComponentsWithTimeZone:self.timeZone];
    
            NSInteger hourStart = comp.hour;
            CGFloat hourStartPosition = hourStart * VERTICAL_DIFF + VERTICAL_INSET;
    
            NSInteger minuteStart = round(comp.minute / 5.0) * 5;
            CGFloat minuteStartPosition = roundf((CGFloat)minuteStart / 60.0f * VERTICAL_DIFF);
    
            CGRect eventFrame = CGRectMake(self.nowLineView.frame.origin.x, hourStartPosition + minuteStartPosition - 5, NOB_SIZE + self.frame.size.width - LEFT_INSET, NOB_SIZE);
            self.nowLineView.frame = eventFrame;
            [sv addSubview:self.nowLineView];
    
        }
    
        if(!self.dataSource) return;
    
        timeline.events = [NSMutableArray new];
        [self.dataSource calendarDayTimelineView:self eventsForDate:timeline.date andEvents:timeline.events success:^{
            [timeline.events sortUsingComparator:^NSComparisonResult(TKCalendarDayEventView *obj1, TKCalendarDayEventView *obj2){
                return [obj1.startDate compare:obj2.startDate];
            }];
    
            [self _realignEventsAtIndex:index];
            if(self.nowLineView.superview == sv)
                [sv bringSubviewToFront:self.nowLineView];
        }];
    }
    

    然后将eventsForDate函数更改为如下所示:

    - (void) calendarDayTimelineView:(TKCalendarDayView*)calendarDayTimeline eventsForDate:(NSDate *)eventDate andEvents:(NSMutableArray *)events success:(void (^)())success {
    
        [Model doSomethingAsync andSuccess:^(NSArray *classes) {
    
            // .. Add stuff to events..
    
            success();
        }];
    }
    

    我假设其他控件的模式非常相似。前提是,在获取数据之前,您正在等待继续格式化/布局流程。